diff --git a/src/gui/Core/hiperiso_crc32.c b/src/gui/Core/hiperiso_crc32.c new file mode 100644 index 0000000..d5a5cfc --- /dev/null +++ b/src/gui/Core/hiperiso_crc32.c @@ -0,0 +1,299 @@ +/****************************************************************************** + * crc32.c ---- hiperiso crc32 + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#include +#include +#include +#include +#include +#include + +static uint32_t g_crc_table[256] = { + 0x00000000, + 0x77073096, + 0xEE0E612C, + 0x990951BA, + 0x076DC419, + 0x706AF48F, + 0xE963A535, + 0x9E6495A3, + 0x0EDB8832, + 0x79DCB8A4, + 0xE0D5E91E, + 0x97D2D988, + 0x09B64C2B, + 0x7EB17CBD, + 0xE7B82D07, + 0x90BF1D91, + 0x1DB71064, + 0x6AB020F2, + 0xF3B97148, + 0x84BE41DE, + 0x1ADAD47D, + 0x6DDDE4EB, + 0xF4D4B551, + 0x83D385C7, + 0x136C9856, + 0x646BA8C0, + 0xFD62F97A, + 0x8A65C9EC, + 0x14015C4F, + 0x63066CD9, + 0xFA0F3D63, + 0x8D080DF5, + 0x3B6E20C8, + 0x4C69105E, + 0xD56041E4, + 0xA2677172, + 0x3C03E4D1, + 0x4B04D447, + 0xD20D85FD, + 0xA50AB56B, + 0x35B5A8FA, + 0x42B2986C, + 0xDBBBC9D6, + 0xACBCF940, + 0x32D86CE3, + 0x45DF5C75, + 0xDCD60DCF, + 0xABD13D59, + 0x26D930AC, + 0x51DE003A, + 0xC8D75180, + 0xBFD06116, + 0x21B4F4B5, + 0x56B3C423, + 0xCFBA9599, + 0xB8BDA50F, + 0x2802B89E, + 0x5F058808, + 0xC60CD9B2, + 0xB10BE924, + 0x2F6F7C87, + 0x58684C11, + 0xC1611DAB, + 0xB6662D3D, + 0x76DC4190, + 0x01DB7106, + 0x98D220BC, + 0xEFD5102A, + 0x71B18589, + 0x06B6B51F, + 0x9FBFE4A5, + 0xE8B8D433, + 0x7807C9A2, + 0x0F00F934, + 0x9609A88E, + 0xE10E9818, + 0x7F6A0DBB, + 0x086D3D2D, + 0x91646C97, + 0xE6635C01, + 0x6B6B51F4, + 0x1C6C6162, + 0x856530D8, + 0xF262004E, + 0x6C0695ED, + 0x1B01A57B, + 0x8208F4C1, + 0xF50FC457, + 0x65B0D9C6, + 0x12B7E950, + 0x8BBEB8EA, + 0xFCB9887C, + 0x62DD1DDF, + 0x15DA2D49, + 0x8CD37CF3, + 0xFBD44C65, + 0x4DB26158, + 0x3AB551CE, + 0xA3BC0074, + 0xD4BB30E2, + 0x4ADFA541, + 0x3DD895D7, + 0xA4D1C46D, + 0xD3D6F4FB, + 0x4369E96A, + 0x346ED9FC, + 0xAD678846, + 0xDA60B8D0, + 0x44042D73, + 0x33031DE5, + 0xAA0A4C5F, + 0xDD0D7CC9, + 0x5005713C, + 0x270241AA, + 0xBE0B1010, + 0xC90C2086, + 0x5768B525, + 0x206F85B3, + 0xB966D409, + 0xCE61E49F, + 0x5EDEF90E, + 0x29D9C998, + 0xB0D09822, + 0xC7D7A8B4, + 0x59B33D17, + 0x2EB40D81, + 0xB7BD5C3B, + 0xC0BA6CAD, + 0xEDB88320, + 0x9ABFB3B6, + 0x03B6E20C, + 0x74B1D29A, + 0xEAD54739, + 0x9DD277AF, + 0x04DB2615, + 0x73DC1683, + 0xE3630B12, + 0x94643B84, + 0x0D6D6A3E, + 0x7A6A5AA8, + 0xE40ECF0B, + 0x9309FF9D, + 0x0A00AE27, + 0x7D079EB1, + 0xF00F9344, + 0x8708A3D2, + 0x1E01F268, + 0x6906C2FE, + 0xF762575D, + 0x806567CB, + 0x196C3671, + 0x6E6B06E7, + 0xFED41B76, + 0x89D32BE0, + 0x10DA7A5A, + 0x67DD4ACC, + 0xF9B9DF6F, + 0x8EBEEFF9, + 0x17B7BE43, + 0x60B08ED5, + 0xD6D6A3E8, + 0xA1D1937E, + 0x38D8C2C4, + 0x4FDFF252, + 0xD1BB67F1, + 0xA6BC5767, + 0x3FB506DD, + 0x48B2364B, + 0xD80D2BDA, + 0xAF0A1B4C, + 0x36034AF6, + 0x41047A60, + 0xDF60EFC3, + 0xA867DF55, + 0x316E8EEF, + 0x4669BE79, + 0xCB61B38C, + 0xBC66831A, + 0x256FD2A0, + 0x5268E236, + 0xCC0C7795, + 0xBB0B4703, + 0x220216B9, + 0x5505262F, + 0xC5BA3BBE, + 0xB2BD0B28, + 0x2BB45A92, + 0x5CB36A04, + 0xC2D7FFA7, + 0xB5D0CF31, + 0x2CD99E8B, + 0x5BDEAE1D, + 0x9B64C2B0, + 0xEC63F226, + 0x756AA39C, + 0x026D930A, + 0x9C0906A9, + 0xEB0E363F, + 0x72076785, + 0x05005713, + 0x95BF4A82, + 0xE2B87A14, + 0x7BB12BAE, + 0x0CB61B38, + 0x92D28E9B, + 0xE5D5BE0D, + 0x7CDCEFB7, + 0x0BDBDF21, + 0x86D3D2D4, + 0xF1D4E242, + 0x68DDB3F8, + 0x1FDA836E, + 0x81BE16CD, + 0xF6B9265B, + 0x6FB077E1, + 0x18B74777, + 0x88085AE6, + 0xFF0F6A70, + 0x66063BCA, + 0x11010B5C, + 0x8F659EFF, + 0xF862AE69, + 0x616BFFD3, + 0x166CCF45, + 0xA00AE278, + 0xD70DD2EE, + 0x4E048354, + 0x3903B3C2, + 0xA7672661, + 0xD06016F7, + 0x4969474D, + 0x3E6E77DB, + 0xAED16A4A, + 0xD9D65ADC, + 0x40DF0B66, + 0x37D83BF0, + 0xA9BCAE53, + 0xDEBB9EC5, + 0x47B2CF7F, + 0x30B5FFE9, + 0xBDBDF21C, + 0xCABAC28A, + 0x53B39330, + 0x24B4A3A6, + 0xBAD03605, + 0xCDD70693, + 0x54DE5729, + 0x23D967BF, + 0xB3667A2E, + 0xC4614AB8, + 0x5D681B02, + 0x2A6F2B94, + 0xB40BBE37, + 0xC30C8EA1, + 0x5A05DF1B, + 0x2D02EF8D +}; + +uint32_t hiperiso_crc32(void *Buffer, uint32_t Length) +{ + uint32_t i; + uint8_t *Ptr = Buffer; + uint32_t Crc = 0xFFFFFFFF; + + for (i = 0; i < Length; i++, Ptr++) + { + Crc = (Crc >> 8) ^ g_crc_table[(uint8_t) Crc ^ *Ptr]; + } + + return Crc ^ 0xffffffff; +} + diff --git a/src/gui/Core/hiperiso_define.h b/src/gui/Core/hiperiso_define.h new file mode 100644 index 0000000..ac9cca0 --- /dev/null +++ b/src/gui/Core/hiperiso_define.h @@ -0,0 +1,190 @@ +/****************************************************************************** + * hiperiso_define.h + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#ifndef __HIPERISO_DEFINE_H__ +#define __HIPERISO_DEFINE_H__ + +#define MAX_DISK_NUM 256 + +#define SIZE_1MB 1048576 +#define SIZE_1GB 1073741824 + +#define HISOIMG_PART_START_BYTES (1024 * 1024) +#define HISOIMG_PART_START_SECTOR 2048 + +#define HISOEFI_PART_BYTES (32 * 1024 * 1024) +#define HISOEFI_PART_SECTORS 65536 + +#pragma pack(1) + +typedef struct hiso_guid +{ + uint32_t data1; + uint16_t data2; + uint16_t data3; + uint8_t data4[8]; +}hiso_guid; + +typedef struct PART_TABLE +{ + uint8_t Active; // 0x00 0x80 + + uint8_t StartHead; + uint16_t StartSector : 6; + uint16_t StartCylinder : 10; + + uint8_t FsFlag; + + uint8_t EndHead; + uint16_t EndSector : 6; + uint16_t EndCylinder : 10; + + uint32_t StartSectorId; + uint32_t SectorCount; +}PART_TABLE; + +typedef struct MBR_HEAD +{ + uint8_t BootCode[446]; + PART_TABLE PartTbl[4]; + uint8_t Byte55; + uint8_t ByteAA; +}MBR_HEAD; + +typedef struct HISO_GPT_HDR +{ + char Signature[8]; /* EFI PART */ + uint8_t Version[4]; + uint32_t Length; + uint32_t Crc; + uint8_t Reserved1[4]; + uint64_t EfiStartLBA; + uint64_t EfiBackupLBA; + uint64_t PartAreaStartLBA; + uint64_t PartAreaEndLBA; + hiso_guid DiskGuid; + uint64_t PartTblStartLBA; + uint32_t PartTblTotNum; + uint32_t PartTblEntryLen; + uint32_t PartTblCrc; + uint8_t Reserved2[420]; +}HISO_GPT_HDR; + +typedef struct HISO_GPT_PART_TBL +{ + hiso_guid PartType; + hiso_guid PartGuid; + uint64_t StartLBA; + uint64_t LastLBA; + uint64_t Attr; + uint16_t Name[36]; +}HISO_GPT_PART_TBL; + +typedef struct HISO_GPT_INFO +{ + MBR_HEAD MBR; + HISO_GPT_HDR Head; + HISO_GPT_PART_TBL PartTbl[128]; +}HISO_GPT_INFO; +#pragma pack() + + +#define MBR_PART_STYLE 0 +#define GPT_PART_STYLE 1 + +typedef struct disk_hiperiso_data +{ + int hiperiso_valid; + + char hiperiso_ver[32]; // 1.0.33 ... + int secure_boot_flag; + uint64_t preserved_space; + + uint64_t part2_start_sector; + + int partition_style; // MBR_PART_STYLE/GPT_PART_STYLE + HISO_GPT_INFO gptinfo; + uint8_t rsvdata[4096]; +}disk_hiperiso_data; + + +typedef struct hiperiso_disk +{ + char disk_name[32]; // sda + char disk_path[64]; // /dev/sda + + char part1_name[32]; // sda1 + char part1_path[64]; // /dev/sda1 + char part2_name[32]; // sda2 + char part2_path[64]; // /dev/sda2 + + char disk_model[256]; // Sandisk/Kingston ... + char human_readable_size[32]; + + int is4kn; + int major; + int minor; + int type; + int partstyle; + uint64_t size_in_byte; + + disk_hiperiso_data hisodata; +}hiperiso_disk; + +#pragma pack(1) +typedef struct hiperiso_guid +{ + uint32_t data1; + uint16_t data2; + uint16_t data3; + uint8_t data4[8]; +}hiperiso_guid; +#pragma pack() + +#ifndef O_BINARY +#define O_BINARY 0 +#endif + +#define VLOG_LOG 1 +#define VLOG_DEBUG 2 + +#define ulong unsigned long +#define _ll long long +#define _ull unsigned long long +#define strlcpy(dst, src) strncpy(dst, src, sizeof(dst) - 1) +#define scnprintf(dst, fmt, args...) snprintf(dst, sizeof(dst) - 1, fmt, ##args) + +#define vlog(fmt, args...) hiperiso_syslog(VLOG_LOG, fmt, ##args) +#define vdebug(fmt, args...) hiperiso_syslog(VLOG_DEBUG, fmt, ##args) + +void hiperiso_syslog(int level, const char *Fmt, ...); +void hiperiso_set_loglevel(int level); +uint32_t hiperiso_crc32(void *Buffer, uint32_t Length); + + +static inline void * zalloc(size_t n) +{ + void *p = malloc(n); + if (p) memset(p, 0, n); + return p; +} + + +#endif /* __HIPERISO_DEFINE_H__ */ + diff --git a/src/gui/Core/hiperiso_disk.c b/src/gui/Core/hiperiso_disk.c new file mode 100644 index 0000000..ea5d97d --- /dev/null +++ b/src/gui/Core/hiperiso_disk.c @@ -0,0 +1,779 @@ +/****************************************************************************** + * hiperiso_disk.c ---- hiperiso disk + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int g_disk_num = 0; +static int g_fatlib_media_fd = 0; +static uint64_t g_fatlib_media_offset = 0; +hiperiso_disk *g_disk_list = NULL; + +static const char *g_hiperiso_dev_type_str[HISO_DEVICE_END] = +{ + "unknown", "scsi", "USB", "ide", "dac960", + "cpqarray", "file", "ataraid", "i2o", + "ubd", "dasd", "viodasd", "sx8", "dm", + "xvd", "sd/mmc", "virtblk", "aoe", + "md", "loopback", "nvme", "brd", "pmem" +}; + +static const char * hiperiso_get_dev_type_name(hiperiso_dev_type type) +{ + return (type < HISO_DEVICE_END) ? g_hiperiso_dev_type_str[type] : "unknown"; +} + +static int hiperiso_check_blk_major(int major, const char *type) +{ + int flag = 0; + int valid = 0; + int devnum = 0; + int len = 0; + char line[64]; + char *pos = NULL; + FILE *fp = NULL; + + fp = fopen("/proc/devices", "r"); + if (!fp) + { + return 0; + } + + len = (int)strlen(type); + while (fgets(line, sizeof(line), fp)) + { + if (flag) + { + pos = strchr(line, ' '); + if (pos) + { + devnum = (int)strtol(line, NULL, 10); + if (devnum == major) + { + if (strncmp(pos + 1, type, len) == 0) + { + valid = 1; + } + break; + } + } + } + else if (strncmp(line, "Block devices:", 14) == 0) + { + flag = 1; + } + } + + fclose(fp); + return valid; +} + +static int hiperiso_get_disk_devnum(const char *name, int *major, int* minor) +{ + int rc; + char *pos; + char devnum[16] = {0}; + + rc = hiperiso_get_sys_file_line(devnum, sizeof(devnum), "/sys/block/%s/dev", name); + if (rc) + { + return 1; + } + + pos = strstr(devnum, ":"); + if (!pos) + { + return 1; + } + + *major = (int)strtol(devnum, NULL, 10); + *minor = (int)strtol(pos + 1, NULL, 10); + + return 0; +} + +static hiperiso_dev_type hiperiso_get_dev_type(const char *name, int major, int minor) +{ + int rc; + char syspath[128]; + char dstpath[256]; + + memset(syspath, 0, sizeof(syspath)); + memset(dstpath, 0, sizeof(dstpath)); + + scnprintf(syspath, "/sys/block/%s", name); + rc = readlink(syspath, dstpath, sizeof(dstpath) - 1); + if (rc > 0 && strstr(dstpath, "/usb")) + { + return HISO_DEVICE_USB; + } + + if (SCSI_BLK_MAJOR(major) && (minor % 0x10 == 0)) + { + return HISO_DEVICE_SCSI; + } + else if (IDE_BLK_MAJOR(major) && (minor % 0x40 == 0)) + { + return HISO_DEVICE_IDE; + } + else if (major == DAC960_MAJOR && (minor % 0x8 == 0)) + { + return HISO_DEVICE_DAC960; + } + else if (major == ATARAID_MAJOR && (minor % 0x10 == 0)) + { + return HISO_DEVICE_ATARAID; + } + else if (major == AOE_MAJOR && (minor % 0x10 == 0)) + { + return HISO_DEVICE_AOE; + } + else if (major == DASD_MAJOR && (minor % 0x4 == 0)) + { + return HISO_DEVICE_DASD; + } + else if (major == VIODASD_MAJOR && (minor % 0x8 == 0)) + { + return HISO_DEVICE_VIODASD; + } + else if (SX8_BLK_MAJOR(major) && (minor % 0x20 == 0)) + { + return HISO_DEVICE_SX8; + } + else if (I2O_BLK_MAJOR(major) && (minor % 0x10 == 0)) + { + return HISO_DEVICE_I2O; + } + else if (CPQARRAY_BLK_MAJOR(major) && (minor % 0x10 == 0)) + { + return HISO_DEVICE_CPQARRAY; + } + else if (UBD_MAJOR == major && (minor % 0x10 == 0)) + { + return HISO_DEVICE_UBD; + } + else if (XVD_MAJOR == major && (minor % 0x10 == 0)) + { + return HISO_DEVICE_XVD; + } + else if (SDMMC_MAJOR == major && (minor % 0x8 == 0)) + { + return HISO_DEVICE_SDMMC; + } + else if (hiperiso_check_blk_major(major, "virtblk")) + { + return HISO_DEVICE_VIRTBLK; + } + else if (major == LOOP_MAJOR) + { + return HISO_DEVICE_LOOP; + } + else if (major == MD_MAJOR) + { + return HISO_DEVICE_MD; + } + else if (major == RAM_MAJOR) + { + return HISO_DEVICE_RAM; + } + else if (strstr(name, "nvme") && hiperiso_check_blk_major(major, "blkext")) + { + return HISO_DEVICE_NVME; + } + else if (strstr(name, "pmem") && hiperiso_check_blk_major(major, "blkext")) + { + return HISO_DEVICE_PMEM; + } + + return HISO_DEVICE_END; +} + +static int hiperiso_is_possible_blkdev(const char *name) +{ + if (name[0] == '.') + { + return 0; + } + + /* /dev/ramX */ + if (name[0] == 'r' && name[1] == 'a' && name[2] == 'm') + { + return 0; + } + + /* /dev/zramX */ + if (name[0] == 'z' && name[1] == 'r' && name[2] == 'a' && name[3] == 'm') + { + return 0; + } + + /* /dev/loopX */ + if (name[0] == 'l' && name[1] == 'o' && name[2] == 'o' && name[3] == 'p') + { + return 0; + } + + /* /dev/dm-X */ + if (name[0] == 'd' && name[1] == 'm' && name[2] == '-' && isdigit(name[3])) + { + return 0; + } + + /* /dev/srX */ + if (name[0] == 's' && name[1] == 'r' && isdigit(name[2])) + { + return 0; + } + + return 1; +} + +int hiperiso_is_disk_4k_native(const char *disk) +{ + int fd; + int rc = 0; + int logsector = 0; + int physector = 0; + char diskpath[256] = {0}; + + snprintf(diskpath, sizeof(diskpath) - 1, "/dev/%s", disk); + + fd = open(diskpath, O_RDONLY | O_BINARY); + if (fd >= 0) + { + ioctl(fd, BLKSSZGET, &logsector); + ioctl(fd, BLKPBSZGET, &physector); + + if (logsector == 4096 && physector == 4096) + { + rc = 1; + } + close(fd); + } + + vdebug("is 4k native disk <%s> <%d>\n", disk, rc); + return rc; +} + +uint64_t hiperiso_get_disk_size_in_byte(const char *disk) +{ + int fd; + int rc; + unsigned long long size = 0; + char diskpath[256] = {0}; + char sizebuf[64] = {0}; + + // Try 1: get size from sysfs + snprintf(diskpath, sizeof(diskpath) - 1, "/sys/block/%s/size", disk); + if (access(diskpath, F_OK) >= 0) + { + vdebug("get disk size from sysfs for %s\n", disk); + + fd = open(diskpath, O_RDONLY | O_BINARY); + if (fd >= 0) + { + read(fd, sizebuf, sizeof(sizebuf)); + size = strtoull(sizebuf, NULL, 10); + close(fd); + return (uint64_t)(size * 512); + } + } + else + { + vdebug("%s not exist \n", diskpath); + } + + // Try 2: get size from ioctl + snprintf(diskpath, sizeof(diskpath) - 1, "/dev/%s", disk); + fd = open(diskpath, O_RDONLY); + if (fd >= 0) + { + vdebug("get disk size from ioctl for %s\n", disk); + rc = ioctl(fd, BLKGETSIZE64, &size); + if (rc == -1) + { + size = 0; + vdebug("failed to ioctl %d\n", rc); + } + close(fd); + } + else + { + vdebug("failed to open %s %d\n", diskpath, errno); + } + + vdebug("disk %s size %llu bytes\n", disk, size); + return size; +} + +int hiperiso_get_disk_vendor(const char *name, char *vendorbuf, int bufsize) +{ + return hiperiso_get_sys_file_line(vendorbuf, bufsize, "/sys/block/%s/device/vendor", name); +} + +int hiperiso_get_disk_model(const char *name, char *modelbuf, int bufsize) +{ + return hiperiso_get_sys_file_line(modelbuf, bufsize, "/sys/block/%s/device/model", name); +} + +static int fatlib_media_sector_read(uint32 sector, uint8 *buffer, uint32 sector_count) +{ + lseek(g_fatlib_media_fd, (sector + g_fatlib_media_offset) * 512ULL, SEEK_SET); + read(g_fatlib_media_fd, buffer, sector_count * 512); + + return 1; +} + +static int fatlib_is_secure_boot_enable(void) +{ + void *flfile = NULL; + + flfile = fl_fopen("/EFI/BOOT/grubx64_real.efi", "rb"); + if (flfile) + { + vlog("/EFI/BOOT/grubx64_real.efi find, secure boot in enabled\n"); + fl_fclose(flfile); + return 1; + } + else + { + vlog("/EFI/BOOT/grubx64_real.efi not exist\n"); + } + + return 0; +} + +static int fatlib_get_hiperiso_version(char *verbuf, int bufsize) +{ + int rc = 1; + int size = 0; + char *buf = NULL; + char *pos = NULL; + char *end = NULL; + void *flfile = NULL; + + flfile = fl_fopen("/grub/grub.cfg", "rb"); + if (flfile) + { + fl_fseek(flfile, 0, SEEK_END); + size = (int)fl_ftell(flfile); + + fl_fseek(flfile, 0, SEEK_SET); + + buf = malloc(size + 1); + if (buf) + { + fl_fread(buf, 1, size, flfile); + buf[size] = 0; + + pos = strstr(buf, "HIPERISO_VERSION="); + if (pos) + { + pos += strlen("HIPERISO_VERSION="); + if (*pos == '"') + { + pos++; + } + + end = pos; + while (*end != 0 && *end != '"' && *end != '\r' && *end != '\n') + { + end++; + } + + *end = 0; + + snprintf(verbuf, bufsize - 1, "%s", pos); + rc = 0; + } + free(buf); + } + + fl_fclose(flfile); + } + else + { + vdebug("No grub.cfg found\n"); + } + + return rc; +} + +int hiperiso_get_hiso_data(hiperiso_disk *info, int *ppartstyle) +{ + int i; + int fd; + int len; + int rc = 1; + int ret = 1; + int part_style; + uint64_t part1_start_sector; + uint64_t part1_sector_count; + uint64_t part2_start_sector; + uint64_t part2_sector_count; + uint64_t preserved_space; + char name[64] = {0}; + disk_hiperiso_data *hiso = NULL; + HISO_GPT_INFO *gpt = NULL; + + hiso = &(info->hisodata); + gpt = &(hiso->gptinfo); + memset(hiso, 0, sizeof(disk_hiperiso_data)); + + vdebug("hiperiso_get_hiso_data %s\n", info->disk_path); + + if (info->size_in_byte < (2 * HISOEFI_PART_BYTES)) + { + vdebug("disk %s is too small %llu\n", info->disk_path, (_ull)info->size_in_byte); + return 1; + } + + fd = open(info->disk_path, O_RDONLY | O_BINARY); + if (fd < 0) + { + vdebug("failed to open %s %d\n", info->disk_path, errno); + return 1; + } + + len = (int)read(fd, &(hiso->gptinfo), sizeof(HISO_GPT_INFO)); + if (len != sizeof(HISO_GPT_INFO)) + { + vdebug("failed to read %s %d\n", info->disk_path, errno); + goto end; + } + + if (gpt->MBR.Byte55 != 0x55 || gpt->MBR.ByteAA != 0xAA) + { + vdebug("Invalid mbr magic 0x%x 0x%x\n", gpt->MBR.Byte55, gpt->MBR.ByteAA); + goto end; + } + + if (gpt->MBR.PartTbl[0].FsFlag == 0xEE && strncmp(gpt->Head.Signature, "EFI PART", 8) == 0) + { + part_style = GPT_PART_STYLE; + if (ppartstyle) + { + *ppartstyle = part_style; + } + + if (gpt->PartTbl[0].StartLBA == 0 || gpt->PartTbl[1].StartLBA == 0) + { + vdebug("NO hiperiso efi part layout <%llu %llu>\n", + (_ull)gpt->PartTbl[0].StartLBA, + (_ull)gpt->PartTbl[1].StartLBA); + goto end; + } + + for (i = 0; i < 36; i++) + { + name[i] = (char)(gpt->PartTbl[1].Name[i]); + } + if (strcmp(name, "HISOEFI")) + { + vdebug("Invalid efi part2 name <%s>\n", name); + goto end; + } + + part1_start_sector = gpt->PartTbl[0].StartLBA; + part1_sector_count = gpt->PartTbl[0].LastLBA - part1_start_sector + 1; + part2_start_sector = gpt->PartTbl[1].StartLBA; + part2_sector_count = gpt->PartTbl[1].LastLBA - part2_start_sector + 1; + + preserved_space = info->size_in_byte - (part2_start_sector + part2_sector_count + 33) * 512; + } + else + { + part_style = MBR_PART_STYLE; + if (ppartstyle) + { + *ppartstyle = part_style; + } + + part1_start_sector = gpt->MBR.PartTbl[0].StartSectorId; + part1_sector_count = gpt->MBR.PartTbl[0].SectorCount; + part2_start_sector = gpt->MBR.PartTbl[1].StartSectorId; + part2_sector_count = gpt->MBR.PartTbl[1].SectorCount; + + preserved_space = info->size_in_byte - (part2_start_sector + part2_sector_count) * 512; + } + + if (part1_start_sector != HISOIMG_PART_START_SECTOR || + part2_sector_count != HISOEFI_PART_SECTORS || + (part1_start_sector + part1_sector_count) != part2_start_sector) + { + vdebug("Not valid hiperiso partition layout [%llu %llu] [%llu %llu]\n", + part1_start_sector, part1_sector_count, part2_start_sector, part2_sector_count); + goto end; + } + + vdebug("hiperiso partition layout check OK: [%llu %llu] [%llu %llu]\n", + part1_start_sector, part1_sector_count, part2_start_sector, part2_sector_count); + + hiso->hiperiso_valid = 1; + + vdebug("now check secure boot for %s ...\n", info->disk_path); + + g_fatlib_media_fd = fd; + g_fatlib_media_offset = part2_start_sector; + fl_init(); + + if (0 == fl_attach_media(fatlib_media_sector_read, NULL)) + { + ret = fatlib_get_hiperiso_version(hiso->hiperiso_ver, sizeof(hiso->hiperiso_ver)); + if (ret == 0 && hiso->hiperiso_ver[0]) + { + hiso->secure_boot_flag = fatlib_is_secure_boot_enable(); + } + else + { + vdebug("fatlib_get_hiperiso_version failed %d\n", ret); + } + } + else + { + vdebug("fl_attach_media failed\n"); + } + + fl_shutdown(); + g_fatlib_media_fd = -1; + g_fatlib_media_offset = 0; + + if (hiso->hiperiso_ver[0] == 0) + { + hiso->hiperiso_ver[0] = '?'; + } + + if (0 == hiso->hiperiso_valid) + { + goto end; + } + + lseek(fd, 2040 * 512, SEEK_SET); + read(fd, hiso->rsvdata, sizeof(hiso->rsvdata)); + + hiso->preserved_space = preserved_space; + hiso->partition_style = part_style; + hiso->part2_start_sector = part2_start_sector; + + rc = 0; +end: + hiso_safe_close_fd(fd); + return rc; +} + +int hiperiso_get_disk_info(const char *name, hiperiso_disk *info) +{ + char vendor[64] = {0}; + char model[128] = {0}; + + vdebug("get disk info %s\n", name); + + strlcpy(info->disk_name, name); + scnprintf(info->disk_path, "/dev/%s", name); + + if (strstr(name, "nvme") || strstr(name, "mmc") || strstr(name, "nbd")) + { + scnprintf(info->part1_name, "%sp1", name); + scnprintf(info->part1_path, "/dev/%sp1", name); + scnprintf(info->part2_name, "%sp2", name); + scnprintf(info->part2_path, "/dev/%sp2", name); + } + else + { + scnprintf(info->part1_name, "%s1", name); + scnprintf(info->part1_path, "/dev/%s1", name); + scnprintf(info->part2_name, "%s2", name); + scnprintf(info->part2_path, "/dev/%s2", name); + } + + info->is4kn = hiperiso_is_disk_4k_native(name); + info->size_in_byte = hiperiso_get_disk_size_in_byte(name); + + hiperiso_get_disk_devnum(name, &info->major, &info->minor); + info->type = hiperiso_get_dev_type(name, info->major, info->minor); + hiperiso_get_disk_vendor(name, vendor, sizeof(vendor)); + hiperiso_get_disk_model(name, model, sizeof(model)); + + scnprintf(info->human_readable_size, "%llu GB", (_ull)hiperiso_get_human_readable_gb(info->size_in_byte)); + scnprintf(info->disk_model, "%s %s (%s)", vendor, model, hiperiso_get_dev_type_name(info->type)); + + hiperiso_get_hiso_data(info, &(info->partstyle)); + + vdebug("disk:<%s %d:%d> model:<%s> size:%llu (%s)\n", + info->disk_path, info->major, info->minor, info->disk_model, info->size_in_byte, info->human_readable_size); + + if (info->hisodata.hiperiso_valid) + { + vdebug("%s Hiperiso:<%s> %s secureboot:%d preserve:%llu\n", info->disk_path, info->hisodata.hiperiso_ver, + info->hisodata.partition_style == MBR_PART_STYLE ? "MBR" : "GPT", + info->hisodata.secure_boot_flag, (_ull)(info->hisodata.preserved_space)); + } + else + { + vdebug("%s NO Hiperiso detected\n", info->disk_path); + } + + return 0; +} + +static int hiperiso_disk_compare(const hiperiso_disk *disk1, const hiperiso_disk *disk2) +{ + if (disk1->type == HISO_DEVICE_USB && disk2->type == HISO_DEVICE_USB) + { + return strcmp(disk1->disk_name, disk2->disk_name); + } + else if (disk1->type == HISO_DEVICE_USB) + { + return -1; + } + else if (disk2->type == HISO_DEVICE_USB) + { + return 1; + } + else + { + return strcmp(disk1->disk_name, disk2->disk_name); + } +} + +static int hiperiso_disk_sort(void) +{ + int i, j; + hiperiso_disk *tmp; + + tmp = malloc(sizeof(hiperiso_disk)); + if (!tmp) + { + return 1; + } + + for (i = 0; i < g_disk_num; i++) + for (j = i + 1; j < g_disk_num; j++) + { + if (hiperiso_disk_compare(g_disk_list + i, g_disk_list + j) > 0) + { + memcpy(tmp, g_disk_list + i, sizeof(hiperiso_disk)); + memcpy(g_disk_list + i, g_disk_list + j, sizeof(hiperiso_disk)); + memcpy(g_disk_list + j, tmp, sizeof(hiperiso_disk)); + } + } + + free(tmp); + return 0; +} + +int hiperiso_disk_enumerate_all(void) +{ + int rc = 0; + DIR* dir = NULL; + struct dirent* p = NULL; + + vdebug("hiperiso_disk_enumerate_all\n"); + + dir = opendir("/sys/block"); + if (!dir) + { + vlog("Failed to open /sys/block %d\n", errno); + return 1; + } + + while (((p = readdir(dir)) != NULL) && (g_disk_num < MAX_DISK_NUM)) + { + if (hiperiso_is_possible_blkdev(p->d_name)) + { + memset(g_disk_list + g_disk_num, 0, sizeof(hiperiso_disk)); + if (0 == hiperiso_get_disk_info(p->d_name, g_disk_list + g_disk_num)) + { + g_disk_num++; + } + } + } + closedir(dir); + + hiperiso_disk_sort(); + + return rc; +} + +void hiperiso_disk_dump(hiperiso_disk *cur) +{ + if (cur->hisodata.hiperiso_valid) + { + vdebug("%s [%s] %s\tHiperiso: %s %s secureboot:%d preserve:%llu\n", + cur->disk_path, cur->human_readable_size, cur->disk_model, + cur->hisodata.hiperiso_ver, cur->hisodata.partition_style == MBR_PART_STYLE ? "MBR" : "GPT", + cur->hisodata.secure_boot_flag, (_ull)(cur->hisodata.preserved_space)); + } + else + { + vdebug("%s [%s] %s\tHiperiso: NA\n", cur->disk_path, cur->human_readable_size, cur->disk_model); + } +} + +void hiperiso_disk_dump_all(void) +{ + int i; + + vdebug("============= DISK DUMP ============\n"); + for (i = 0; i < g_disk_num; i++) + { + hiperiso_disk_dump(g_disk_list + i); + } +} + +int hiperiso_disk_install(hiperiso_disk *disk, void *efipartimg) +{ + return 0; +} + + +int hiperiso_disk_init(void) +{ + g_disk_list = malloc(sizeof(hiperiso_disk) * MAX_DISK_NUM); + + hiperiso_disk_enumerate_all(); + hiperiso_disk_dump_all(); + + return 0; +} + +void hiperiso_disk_exit(void) +{ + check_free(g_disk_list); + g_disk_list = NULL; + g_disk_num = 0; +} + + diff --git a/src/gui/Core/hiperiso_disk.h b/src/gui/Core/hiperiso_disk.h new file mode 100644 index 0000000..b2f94a9 --- /dev/null +++ b/src/gui/Core/hiperiso_disk.h @@ -0,0 +1,145 @@ +/****************************************************************************** + * hiperiso_disk.h + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#ifndef __HIPERISO_DISK_H__ +#define __HIPERISO_DISK_H__ + +typedef enum +{ + HISO_DEVICE_UNKNOWN = 0, + HISO_DEVICE_SCSI, + HISO_DEVICE_USB, + HISO_DEVICE_IDE, + HISO_DEVICE_DAC960, + HISO_DEVICE_CPQARRAY, + HISO_DEVICE_FILE, + HISO_DEVICE_ATARAID, + HISO_DEVICE_I2O, + HISO_DEVICE_UBD, + HISO_DEVICE_DASD, + HISO_DEVICE_VIODASD, + HISO_DEVICE_SX8, + HISO_DEVICE_DM, + HISO_DEVICE_XVD, + HISO_DEVICE_SDMMC, + HISO_DEVICE_VIRTBLK, + HISO_DEVICE_AOE, + HISO_DEVICE_MD, + HISO_DEVICE_LOOP, + HISO_DEVICE_NVME, + HISO_DEVICE_RAM, + HISO_DEVICE_PMEM, + + HISO_DEVICE_END +}hiperiso_dev_type; + +/* from */ +#define IDE0_MAJOR 3 +#define IDE1_MAJOR 22 +#define IDE2_MAJOR 33 +#define IDE3_MAJOR 34 +#define IDE4_MAJOR 56 +#define IDE5_MAJOR 57 +#define SCSI_CDROM_MAJOR 11 +#define SCSI_DISK0_MAJOR 8 +#define SCSI_DISK1_MAJOR 65 +#define SCSI_DISK2_MAJOR 66 +#define SCSI_DISK3_MAJOR 67 +#define SCSI_DISK4_MAJOR 68 +#define SCSI_DISK5_MAJOR 69 +#define SCSI_DISK6_MAJOR 70 +#define SCSI_DISK7_MAJOR 71 +#define SCSI_DISK8_MAJOR 128 +#define SCSI_DISK9_MAJOR 129 +#define SCSI_DISK10_MAJOR 130 +#define SCSI_DISK11_MAJOR 131 +#define SCSI_DISK12_MAJOR 132 +#define SCSI_DISK13_MAJOR 133 +#define SCSI_DISK14_MAJOR 134 +#define SCSI_DISK15_MAJOR 135 +#define COMPAQ_SMART2_MAJOR 72 +#define COMPAQ_SMART2_MAJOR1 73 +#define COMPAQ_SMART2_MAJOR2 74 +#define COMPAQ_SMART2_MAJOR3 75 +#define COMPAQ_SMART2_MAJOR4 76 +#define COMPAQ_SMART2_MAJOR5 77 +#define COMPAQ_SMART2_MAJOR6 78 +#define COMPAQ_SMART2_MAJOR7 79 +#define COMPAQ_SMART_MAJOR 104 +#define COMPAQ_SMART_MAJOR1 105 +#define COMPAQ_SMART_MAJOR2 106 +#define COMPAQ_SMART_MAJOR3 107 +#define COMPAQ_SMART_MAJOR4 108 +#define COMPAQ_SMART_MAJOR5 109 +#define COMPAQ_SMART_MAJOR6 110 +#define COMPAQ_SMART_MAJOR7 111 +#define DAC960_MAJOR 48 +#define ATARAID_MAJOR 114 +#define I2O_MAJOR1 80 +#define I2O_MAJOR2 81 +#define I2O_MAJOR3 82 +#define I2O_MAJOR4 83 +#define I2O_MAJOR5 84 +#define I2O_MAJOR6 85 +#define I2O_MAJOR7 86 +#define I2O_MAJOR8 87 +#define UBD_MAJOR 98 +#define DASD_MAJOR 94 +#define VIODASD_MAJOR 112 +#define AOE_MAJOR 152 +#define SX8_MAJOR1 160 +#define SX8_MAJOR2 161 +#define XVD_MAJOR 202 +#define SDMMC_MAJOR 179 +#define LOOP_MAJOR 7 +#define MD_MAJOR 9 +#define BLKEXT_MAJOR 259 +#define RAM_MAJOR 1 + +#define SCSI_BLK_MAJOR(M) ( \ + (M) == SCSI_DISK0_MAJOR \ + || (M) == SCSI_CDROM_MAJOR \ + || ((M) >= SCSI_DISK1_MAJOR && (M) <= SCSI_DISK7_MAJOR) \ + || ((M) >= SCSI_DISK8_MAJOR && (M) <= SCSI_DISK15_MAJOR)) + +#define IDE_BLK_MAJOR(M) \ + ((M) == IDE0_MAJOR || \ + (M) == IDE1_MAJOR || \ + (M) == IDE2_MAJOR || \ + (M) == IDE3_MAJOR || \ + (M) == IDE4_MAJOR || \ + (M) == IDE5_MAJOR) + +#define SX8_BLK_MAJOR(M) ((M) >= SX8_MAJOR1 && (M) <= SX8_MAJOR2) +#define I2O_BLK_MAJOR(M) ((M) >= I2O_MAJOR1 && (M) <= I2O_MAJOR8) +#define CPQARRAY_BLK_MAJOR(M) \ + (((M) >= COMPAQ_SMART2_MAJOR && (M) <= COMPAQ_SMART2_MAJOR7) || \ + (COMPAQ_SMART_MAJOR <= (M) && (M) <= COMPAQ_SMART_MAJOR7)) + +#define HIPERISO_FILE_STG1_IMG "boot/core.img.xz" +#define HIPERISO_FILE_DISK_IMG "hiperiso/hiperiso.disk.img.xz" + +extern int g_disk_num; +extern hiperiso_disk *g_disk_list; +int hiperiso_disk_enumerate_all(void); +int hiperiso_disk_init(void); +void hiperiso_disk_exit(void); + +#endif /* __HIPERISO_DISK_H__ */ + diff --git a/src/gui/Core/hiperiso_json.c b/src/gui/Core/hiperiso_json.c new file mode 100644 index 0000000..a60fd11 --- /dev/null +++ b/src/gui/Core/hiperiso_json.c @@ -0,0 +1,718 @@ +/****************************************************************************** + * hiperiso_json.c + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static void hiso_json_free(HISO_JSON *pstJsonHead) +{ + HISO_JSON *pstNext = NULL; + + while (NULL != pstJsonHead) + { + pstNext = pstJsonHead->pstNext; + if ((pstJsonHead->enDataType < JSON_TYPE_BUTT) && (NULL != pstJsonHead->pstChild)) + { + hiso_json_free(pstJsonHead->pstChild); + } + + free(pstJsonHead); + pstJsonHead = pstNext; + } + + return; +} + +static char *hiso_json_skip(const char *pcData) +{ + while ((NULL != pcData) && ('\0' != *pcData) && (*pcData <= 32)) + { + pcData++; + } + + return (char *)pcData; +} + +HISO_JSON *hiso_json_find_item +( + HISO_JSON *pstJson, + JSON_TYPE enDataType, + const char *szKey +) +{ + while (NULL != pstJson) + { + if ((enDataType == pstJson->enDataType) && + (0 == strcmp(szKey, pstJson->pcName))) + { + return pstJson; + } + pstJson = pstJson->pstNext; + } + + return NULL; +} + +static int hiso_json_parse_number +( + HISO_JSON *pstJson, + const char *pcData, + const char **ppcEnd +) +{ + unsigned long Value; + + Value = strtoul(pcData, (char **)ppcEnd, 10); + if (*ppcEnd == pcData) + { + vdebug("Failed to parse json number %s.\n", pcData); + return JSON_FAILED; + } + + pstJson->enDataType = JSON_TYPE_NUMBER; + pstJson->unData.lValue = Value; + + return JSON_SUCCESS; +} + +static int hiso_json_parse_string +( + char *pcNewStart, + char *pcRawStart, + HISO_JSON *pstJson, + const char *pcData, + const char **ppcEnd +) +{ + uint32_t uiLen = 0; + const char *pcPos = NULL; + const char *pcTmp = pcData + 1; + + *ppcEnd = pcData; + + if ('\"' != *pcData) + { + return JSON_FAILED; + } + + pcPos = strchr(pcTmp, '\"'); + if ((NULL == pcPos) || (pcPos < pcTmp)) + { + vdebug("Invalid string %s.\n", pcData); + return JSON_FAILED; + } + + *ppcEnd = pcPos + 1; + uiLen = (uint32_t)(unsigned long)(pcPos - pcTmp); + + pstJson->enDataType = JSON_TYPE_STRING; + pstJson->unData.pcStrVal = pcNewStart + (pcTmp - pcRawStart); + pstJson->unData.pcStrVal[uiLen] = '\0'; + + return JSON_SUCCESS; +} + +static int hiso_json_parse_array +( + char *pcNewStart, + char *pcRawStart, + HISO_JSON *pstJson, + const char *pcData, + const char **ppcEnd +) +{ + int Ret = JSON_SUCCESS; + HISO_JSON *pstJsonChild = NULL; + HISO_JSON *pstJsonItem = NULL; + const char *pcTmp = pcData + 1; + + *ppcEnd = pcData; + pstJson->enDataType = JSON_TYPE_ARRAY; + + if ('[' != *pcData) + { + return JSON_FAILED; + } + + pcTmp = hiso_json_skip(pcTmp); + + if (']' == *pcTmp) + { + *ppcEnd = pcTmp + 1; + return JSON_SUCCESS; + } + + JSON_NEW_ITEM(pstJson->pstChild, JSON_FAILED); + + Ret = hiso_json_parse_value(pcNewStart, pcRawStart, pstJson->pstChild, pcTmp, ppcEnd); + if (JSON_SUCCESS != Ret) + { + vdebug("Failed to parse array child.\n"); + return JSON_FAILED; + } + + pstJsonChild = pstJson->pstChild; + pcTmp = hiso_json_skip(*ppcEnd); + while ((NULL != pcTmp) && (',' == *pcTmp)) + { + JSON_NEW_ITEM(pstJsonItem, JSON_FAILED); + pstJsonChild->pstNext = pstJsonItem; + pstJsonItem->pstPrev = pstJsonChild; + pstJsonChild = pstJsonItem; + + Ret = hiso_json_parse_value(pcNewStart, pcRawStart, pstJsonChild, hiso_json_skip(pcTmp + 1), ppcEnd); + if (JSON_SUCCESS != Ret) + { + vdebug("Failed to parse array child.\n"); + return JSON_FAILED; + } + pcTmp = hiso_json_skip(*ppcEnd); + } + + if ((NULL != pcTmp) && (']' == *pcTmp)) + { + *ppcEnd = pcTmp + 1; + return JSON_SUCCESS; + } + else + { + *ppcEnd = pcTmp; + return JSON_FAILED; + } +} + +static int hiso_json_parse_object +( + char *pcNewStart, + char *pcRawStart, + HISO_JSON *pstJson, + const char *pcData, + const char **ppcEnd +) +{ + int Ret = JSON_SUCCESS; + HISO_JSON *pstJsonChild = NULL; + HISO_JSON *pstJsonItem = NULL; + const char *pcTmp = pcData + 1; + + *ppcEnd = pcData; + pstJson->enDataType = JSON_TYPE_OBJECT; + + if ('{' != *pcData) + { + return JSON_FAILED; + } + + pcTmp = hiso_json_skip(pcTmp); + if ('}' == *pcTmp) + { + *ppcEnd = pcTmp + 1; + return JSON_SUCCESS; + } + + JSON_NEW_ITEM(pstJson->pstChild, JSON_FAILED); + + Ret = hiso_json_parse_string(pcNewStart, pcRawStart, pstJson->pstChild, pcTmp, ppcEnd); + if (JSON_SUCCESS != Ret) + { + vdebug("Failed to parse array child.\n"); + return JSON_FAILED; + } + + pstJsonChild = pstJson->pstChild; + pstJsonChild->pcName = pstJsonChild->unData.pcStrVal; + pstJsonChild->unData.pcStrVal = NULL; + + pcTmp = hiso_json_skip(*ppcEnd); + if ((NULL == pcTmp) || (':' != *pcTmp)) + { + *ppcEnd = pcTmp; + return JSON_FAILED; + } + + Ret = hiso_json_parse_value(pcNewStart, pcRawStart, pstJsonChild, hiso_json_skip(pcTmp + 1), ppcEnd); + if (JSON_SUCCESS != Ret) + { + vdebug("Failed to parse array child.\n"); + return JSON_FAILED; + } + + pcTmp = hiso_json_skip(*ppcEnd); + while ((NULL != pcTmp) && (',' == *pcTmp)) + { + JSON_NEW_ITEM(pstJsonItem, JSON_FAILED); + pstJsonChild->pstNext = pstJsonItem; + pstJsonItem->pstPrev = pstJsonChild; + pstJsonChild = pstJsonItem; + + Ret = hiso_json_parse_string(pcNewStart, pcRawStart, pstJsonChild, hiso_json_skip(pcTmp + 1), ppcEnd); + if (JSON_SUCCESS != Ret) + { + vdebug("Failed to parse array child.\n"); + return JSON_FAILED; + } + + pcTmp = hiso_json_skip(*ppcEnd); + pstJsonChild->pcName = pstJsonChild->unData.pcStrVal; + pstJsonChild->unData.pcStrVal = NULL; + if ((NULL == pcTmp) || (':' != *pcTmp)) + { + *ppcEnd = pcTmp; + return JSON_FAILED; + } + + Ret = hiso_json_parse_value(pcNewStart, pcRawStart, pstJsonChild, hiso_json_skip(pcTmp + 1), ppcEnd); + if (JSON_SUCCESS != Ret) + { + vdebug("Failed to parse array child.\n"); + return JSON_FAILED; + } + + pcTmp = hiso_json_skip(*ppcEnd); + } + + if ((NULL != pcTmp) && ('}' == *pcTmp)) + { + *ppcEnd = pcTmp + 1; + return JSON_SUCCESS; + } + else + { + *ppcEnd = pcTmp; + return JSON_FAILED; + } +} + +int hiso_json_parse_value +( + char *pcNewStart, + char *pcRawStart, + HISO_JSON *pstJson, + const char *pcData, + const char **ppcEnd +) +{ + pcData = hiso_json_skip(pcData); + + switch (*pcData) + { + case 'n': + { + if (0 == strncmp(pcData, "null", 4)) + { + pstJson->enDataType = JSON_TYPE_NULL; + *ppcEnd = pcData + 4; + return JSON_SUCCESS; + } + break; + } + case 'f': + { + if (0 == strncmp(pcData, "false", 5)) + { + pstJson->enDataType = JSON_TYPE_BOOL; + pstJson->unData.lValue = 0; + *ppcEnd = pcData + 5; + return JSON_SUCCESS; + } + break; + } + case 't': + { + if (0 == strncmp(pcData, "true", 4)) + { + pstJson->enDataType = JSON_TYPE_BOOL; + pstJson->unData.lValue = 1; + *ppcEnd = pcData + 4; + return JSON_SUCCESS; + } + break; + } + case '\"': + { + return hiso_json_parse_string(pcNewStart, pcRawStart, pstJson, pcData, ppcEnd); + } + case '[': + { + return hiso_json_parse_array(pcNewStart, pcRawStart, pstJson, pcData, ppcEnd); + } + case '{': + { + return hiso_json_parse_object(pcNewStart, pcRawStart, pstJson, pcData, ppcEnd); + } + case '-': + { + return hiso_json_parse_number(pstJson, pcData, ppcEnd); + } + default : + { + if (*pcData >= '0' && *pcData <= '9') + { + return hiso_json_parse_number(pstJson, pcData, ppcEnd); + } + } + } + + *ppcEnd = pcData; + vdebug("Invalid json data %u.\n", (uint8_t)(*pcData)); + return JSON_FAILED; +} + +HISO_JSON * hiso_json_create(void) +{ + HISO_JSON *pstJson = NULL; + + pstJson = (HISO_JSON *)zalloc(sizeof(HISO_JSON)); + if (NULL == pstJson) + { + return NULL; + } + + return pstJson; +} + +int hiso_json_parse(HISO_JSON *pstJson, const char *szJsonData) +{ + uint32_t uiMemSize = 0; + int Ret = JSON_SUCCESS; + char *pcNewBuf = NULL; + const char *pcEnd = NULL; + + uiMemSize = strlen(szJsonData) + 1; + pcNewBuf = (char *)malloc(uiMemSize); + if (NULL == pcNewBuf) + { + vdebug("Failed to alloc new buf.\n"); + return JSON_FAILED; + } + memcpy(pcNewBuf, szJsonData, uiMemSize); + pcNewBuf[uiMemSize - 1] = 0; + + Ret = hiso_json_parse_value(pcNewBuf, (char *)szJsonData, pstJson, szJsonData, &pcEnd); + if (JSON_SUCCESS != Ret) + { + vdebug("Failed to parse json data %s start=%p, end=%p:%s.\n", + szJsonData, szJsonData, pcEnd, pcEnd); + return JSON_FAILED; + } + + return JSON_SUCCESS; +} + +int hiso_json_scan_parse +( + const HISO_JSON *pstJson, + uint32_t uiParseNum, + HISO_JSON_PARSE_S *pstJsonParse +) +{ + uint32_t i = 0; + const HISO_JSON *pstJsonCur = NULL; + HISO_JSON_PARSE_S *pstCurParse = NULL; + + for (pstJsonCur = pstJson; NULL != pstJsonCur; pstJsonCur = pstJsonCur->pstNext) + { + if ((JSON_TYPE_OBJECT == pstJsonCur->enDataType) || + (JSON_TYPE_ARRAY == pstJsonCur->enDataType)) + { + continue; + } + + for (i = 0, pstCurParse = NULL; i < uiParseNum; i++) + { + if (0 == strcmp(pstJsonParse[i].pcKey, pstJsonCur->pcName)) + { + pstCurParse = pstJsonParse + i; + break; + } + } + + if (NULL == pstCurParse) + { + continue; + } + + switch (pstJsonCur->enDataType) + { + case JSON_TYPE_NUMBER: + { + if (sizeof(uint32_t) == pstCurParse->uiBufSize) + { + *(uint32_t *)(pstCurParse->pDataBuf) = (uint32_t)pstJsonCur->unData.lValue; + } + else if (sizeof(uint16_t) == pstCurParse->uiBufSize) + { + *(uint16_t *)(pstCurParse->pDataBuf) = (uint16_t)pstJsonCur->unData.lValue; + } + else if (sizeof(uint8_t) == pstCurParse->uiBufSize) + { + *(uint8_t *)(pstCurParse->pDataBuf) = (uint8_t)pstJsonCur->unData.lValue; + } + else if ((pstCurParse->uiBufSize > sizeof(uint64_t))) + { + snprintf((char *)pstCurParse->pDataBuf, pstCurParse->uiBufSize, "%llu", + (unsigned long long)(pstJsonCur->unData.lValue)); + } + else + { + vdebug("Invalid number data buf size %u.\n", pstCurParse->uiBufSize); + } + break; + } + case JSON_TYPE_STRING: + { + strncpy((char *)pstCurParse->pDataBuf, pstJsonCur->unData.pcStrVal, pstCurParse->uiBufSize); + break; + } + case JSON_TYPE_BOOL: + { + *(uint8_t *)(pstCurParse->pDataBuf) = (pstJsonCur->unData.lValue) > 0 ? 1 : 0; + break; + } + default : + { + break; + } + } + } + + return JSON_SUCCESS; +} + +int hiso_json_scan_array +( + HISO_JSON *pstJson, + const char *szKey, + HISO_JSON **ppstArrayItem +) +{ + HISO_JSON *pstJsonItem = NULL; + + pstJsonItem = hiso_json_find_item(pstJson, JSON_TYPE_ARRAY, szKey); + if (NULL == pstJsonItem) + { + vdebug("Key %s is not found in json data.\n", szKey); + return JSON_NOT_FOUND; + } + + *ppstArrayItem = pstJsonItem; + + return JSON_SUCCESS; +} + +int hiso_json_scan_array_ex +( + HISO_JSON *pstJson, + const char *szKey, + HISO_JSON **ppstArrayItem +) +{ + HISO_JSON *pstJsonItem = NULL; + + pstJsonItem = hiso_json_find_item(pstJson, JSON_TYPE_ARRAY, szKey); + if (NULL == pstJsonItem) + { + vdebug("Key %s is not found in json data.\n", szKey); + return JSON_NOT_FOUND; + } + + *ppstArrayItem = pstJsonItem->pstChild; + + return JSON_SUCCESS; +} + +int hiso_json_scan_object +( + HISO_JSON *pstJson, + const char *szKey, + HISO_JSON **ppstObjectItem +) +{ + HISO_JSON *pstJsonItem = NULL; + + pstJsonItem = hiso_json_find_item(pstJson, JSON_TYPE_OBJECT, szKey); + if (NULL == pstJsonItem) + { + vdebug("Key %s is not found in json data.\n", szKey); + return JSON_NOT_FOUND; + } + + *ppstObjectItem = pstJsonItem; + + return JSON_SUCCESS; +} + +int hiso_json_get_int +( + HISO_JSON *pstJson, + const char *szKey, + int *piValue +) +{ + HISO_JSON *pstJsonItem = NULL; + + pstJsonItem = hiso_json_find_item(pstJson, JSON_TYPE_NUMBER, szKey); + if (NULL == pstJsonItem) + { + vdebug("Key %s is not found in json data.\n", szKey); + return JSON_NOT_FOUND; + } + + *piValue = (int)pstJsonItem->unData.lValue; + + return JSON_SUCCESS; +} + +int hiso_json_get_uint +( + HISO_JSON *pstJson, + const char *szKey, + uint32_t *puiValue +) +{ + HISO_JSON *pstJsonItem = NULL; + + pstJsonItem = hiso_json_find_item(pstJson, JSON_TYPE_NUMBER, szKey); + if (NULL == pstJsonItem) + { + vdebug("Key %s is not found in json data.\n", szKey); + return JSON_NOT_FOUND; + } + + *puiValue = (uint32_t)pstJsonItem->unData.lValue; + + return JSON_SUCCESS; +} + +int hiso_json_get_uint64 +( + HISO_JSON *pstJson, + const char *szKey, + uint64_t *pui64Value +) +{ + HISO_JSON *pstJsonItem = NULL; + + pstJsonItem = hiso_json_find_item(pstJson, JSON_TYPE_NUMBER, szKey); + if (NULL == pstJsonItem) + { + vdebug("Key %s is not found in json data.\n", szKey); + return JSON_NOT_FOUND; + } + + *pui64Value = (uint64_t)pstJsonItem->unData.lValue; + + return JSON_SUCCESS; +} + +int hiso_json_get_bool +( + HISO_JSON *pstJson, + const char *szKey, + uint8_t *pbValue +) +{ + HISO_JSON *pstJsonItem = NULL; + + pstJsonItem = hiso_json_find_item(pstJson, JSON_TYPE_BOOL, szKey); + if (NULL == pstJsonItem) + { + vdebug("Key %s is not found in json data.\n", szKey); + return JSON_NOT_FOUND; + } + + *pbValue = pstJsonItem->unData.lValue > 0 ? 1 : 0; + + return JSON_SUCCESS; +} + +int hiso_json_get_string +( + HISO_JSON *pstJson, + const char *szKey, + uint32_t uiBufLen, + char *pcBuf +) +{ + HISO_JSON *pstJsonItem = NULL; + + pstJsonItem = hiso_json_find_item(pstJson, JSON_TYPE_STRING, szKey); + if (NULL == pstJsonItem) + { + vdebug("Key %s is not found in json data.\n", szKey); + return JSON_NOT_FOUND; + } + + strncpy(pcBuf, pstJsonItem->unData.pcStrVal, uiBufLen); + + return JSON_SUCCESS; +} + +const char * hiso_json_get_string_ex(HISO_JSON *pstJson, const char *szKey) +{ + HISO_JSON *pstJsonItem = NULL; + + if ((NULL == pstJson) || (NULL == szKey)) + { + return NULL; + } + + pstJsonItem = hiso_json_find_item(pstJson, JSON_TYPE_STRING, szKey); + if (NULL == pstJsonItem) + { + vdebug("Key %s is not found in json data.\n", szKey); + return NULL; + } + + return pstJsonItem->unData.pcStrVal; +} + +int hiso_json_destroy(HISO_JSON *pstJson) +{ + if (NULL == pstJson) + { + return JSON_SUCCESS; + } + + if (NULL != pstJson->pstChild) + { + hiso_json_free(pstJson->pstChild); + } + + if (NULL != pstJson->pstNext) + { + hiso_json_free(pstJson->pstNext); + } + + free(pstJson); + + return JSON_SUCCESS; +} + diff --git a/src/gui/Core/hiperiso_json.h b/src/gui/Core/hiperiso_json.h new file mode 100644 index 0000000..5b727a3 --- /dev/null +++ b/src/gui/Core/hiperiso_json.h @@ -0,0 +1,268 @@ +/****************************************************************************** + * hiperiso_json.h + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#ifndef __HIPERISO_JSON_H__ +#define __HIPERISO_JSON_H__ + +#define JSON_NEW_ITEM(pstJson, ret) \ +{ \ + (pstJson) = (HISO_JSON *)zalloc(sizeof(HISO_JSON)); \ + if (NULL == (pstJson)) \ + { \ + vdebug("Failed to alloc memory for json."); \ + return (ret); \ + } \ +} + +#define ssprintf(curpos, buf, len, fmt, args...) \ + curpos += snprintf(buf + curpos, len - curpos, fmt, ##args) + +#define HISO_JSON_IS_SKIPABLE(c) (((c) <= 32) ? 1 : 0) + +#define HISO_JSON_PRINT_PREFIX(uiDepth, args...) \ +{ \ + uint32_t _uiLoop = 0; \ + for (_uiLoop = 0; _uiLoop < (uiDepth); _uiLoop++) \ + { \ + ssprintf(uiCurPos, pcBuf, uiBufLen, " "); \ + } \ + ssprintf(uiCurPos, pcBuf, uiBufLen, ##args); \ +} + +#define HISO_JSON_SUCCESS_RET "{ \"result\" : \"success\" }" +#define HISO_JSON_FAILED_RET "{ \"result\" : \"failed\" }" +#define HISO_JSON_INVALID_RET "{ \"result\" : \"invalidfmt\" }" +#define HISO_JSON_TOKEN_ERR_RET "{ \"result\" : \"tokenerror\" }" +#define HISO_JSON_EXIST_RET "{ \"result\" : \"exist\" }" +#define HISO_JSON_TIMEOUT_RET "{ \"result\" : \"timeout\" }" +#define HISO_JSON_BUSY_RET "{ \"result\" : \"busy\" }" +#define HISO_JSON_INUSE_RET "{ \"result\" : \"inuse\" }" +#define HISO_JSON_NOTFOUND_RET "{ \"result\" : \"notfound\" }" +#define HISO_JSON_NOTRUNNING_RET "{ \"result\" : \"notrunning\" }" +#define HISO_JSON_NOT_READY_RET "{ \"result\" : \"notready\" }" +#define HISO_JSON_NOT_SUPPORT_RET "{ \"result\" : \"notsupport\" }" +#define HISO_JSON_MBR_2TB_RET "{ \"result\" : \"mbr2tb\" }" +#define HISO_JSON_4KN_RET "{ \"result\" : \"4kn\" }" +#define HISO_JSON_INVALID_RSV_RET "{ \"result\" : \"reserve_invalid\" }" +#define HISO_JSON_FILE_NOT_FOUND_RET "{ \"result\" : \"file_not_found\" }" + +typedef enum tagJSON_TYPE +{ + JSON_TYPE_NUMBER = 0, + JSON_TYPE_STRING, + JSON_TYPE_BOOL, + JSON_TYPE_ARRAY, + JSON_TYPE_OBJECT, + JSON_TYPE_NULL, + JSON_TYPE_BUTT +}JSON_TYPE; + +typedef struct tagHISO_JSON +{ + struct tagHISO_JSON *pstPrev; + struct tagHISO_JSON *pstNext; + struct tagHISO_JSON *pstChild; + + JSON_TYPE enDataType; + union + { + char *pcStrVal; + int iNumVal; + uint64_t lValue; + }unData; + + char *pcName; +}HISO_JSON; + +#define HISO_JSON_FMT_BEGIN(uiCurPos, pcBuf, uiBufLen) \ +{\ + uint32_t __uiCurPos = (uiCurPos);\ + uint32_t __uiBufLen = (uiBufLen);\ + char *__pcBuf = (pcBuf); + +#define HISO_JSON_FMT_END(uiCurPos) \ + (uiCurPos) = __uiCurPos;\ +} + +#define HISO_JSON_FMT_OBJ_BEGIN() ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "{") + +#define HISO_JSON_FMT_OBJ_END() \ +{\ + if (',' == *(__pcBuf + (__uiCurPos - 1)))\ + {\ + __uiCurPos -= 1;\ + }\ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "}");\ +} + +#define HISO_JSON_FMT_OBJ_ENDEX() \ +{\ + if (',' == *(__pcBuf + (__uiCurPos - 1)))\ + {\ + __uiCurPos -= 1;\ + }\ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "},");\ +} + +#define HISO_JSON_FMT_KEY(Key) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\":", (Key)) + +#define HISO_JSON_FMT_ITEM(Item) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\",", (Item)) + +#define HISO_JSON_FMT_COMA() ssprintf(__uiCurPos, __pcBuf, __uiBufLen, ","); + +#define HISO_JSON_FMT_APPEND_BEGIN() \ +{ \ + if ('}' == *(__pcBuf + (__uiCurPos - 1)))\ + {\ + __uiCurPos -= 1;\ + }\ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, ",");\ +} + +#define HISO_JSON_FMT_APPEND_END() \ +{ \ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "}");\ +} + +#define HISO_JSON_FMT_ARY_BEGIN() ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "[") + +#define HISO_JSON_FMT_ARY_END() \ +{\ + if (',' == *(__pcBuf + (__uiCurPos - 1)))\ + {\ + __uiCurPos -= 1;\ + }\ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "]");\ +} + +#define HISO_JSON_FMT_ARY_ENDEX() \ +{\ + if (',' == *(__pcBuf + (__uiCurPos - 1)))\ + {\ + __uiCurPos -= 1;\ + }\ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "],");\ +} + +#define HISO_JSON_FMT_UINT64(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\":%llu,", Key, (_ull)Val) + +#define HISO_JSON_FMT_ULONG(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\":%lu,", Key, Val) +#define HISO_JSON_FMT_LONG(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\":%ld,", Key, Val) + +#define HISO_JSON_FMT_UINT(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\":%u,", Key, Val) + +#define HISO_JSON_FMT_STRINT(Key, Val) \ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\":\"%u\",", Key, Val) + +#define HISO_JSON_FMT_STRINT64(Key, Val) \ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\":\"%llu\",", Key, Val) + +#define HISO_JSON_FMT_SINT(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\":%d,", Key, Val) + +#define HISO_JSON_FMT_DUBL(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\":%.1lf,", Key, Val) +#define HISO_JSON_FMT_DUBL2(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\":%10.02lf,", Key, Val) + +#define HISO_JSON_FMT_STRN(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\":\"%s\",", Key, Val) + +#define HISO_JSON_FMT_NULL(Key) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\":null,", Key) + +#define HISO_JSON_FMT_TRUE(Key) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\":true,", (Key)) +#define HISO_JSON_FMT_FALSE(Key) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\":false,", (Key)) + +#define HISO_JSON_FMT_BOOL(Key, Val) \ +{\ + if (0 == (Val))\ + {\ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\":false,", (Key));\ + }\ + else \ + {\ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\":true,", (Key));\ + }\ +} + +typedef struct tagHISO_JSON_PARSE +{ + char *pcKey; + void *pDataBuf; + uint32_t uiBufSize; +}HISO_JSON_PARSE_S; + +#define JSON_SUCCESS 0 +#define JSON_FAILED 1 +#define JSON_NOT_FOUND 2 + +int hiso_json_parse_value +( + char *pcNewStart, + char *pcRawStart, + HISO_JSON *pstJson, + const char *pcData, + const char **ppcEnd +); +HISO_JSON * hiso_json_create(void); +int hiso_json_parse(HISO_JSON *pstJson, const char *szJsonData); +int hiso_json_destroy(HISO_JSON *pstJson); +HISO_JSON *hiso_json_find_item +( + HISO_JSON *pstJson, + JSON_TYPE enDataType, + const char *szKey +); +int hiso_json_scan_parse +( + const HISO_JSON *pstJson, + uint32_t uiParseNum, + HISO_JSON_PARSE_S *pstJsonParse +); +int hiso_json_get_int +( + HISO_JSON *pstJson, + const char *szKey, + int *piValue +); +int hiso_json_get_uint +( + HISO_JSON *pstJson, + const char *szKey, + uint32_t *puiValue +); +int hiso_json_get_uint64 +( + HISO_JSON *pstJson, + const char *szKey, + uint64_t *pui64Value +); +int hiso_json_get_bool +( + HISO_JSON *pstJson, + const char *szKey, + uint8_t *pbValue +); +int hiso_json_get_string +( + HISO_JSON *pstJson, + const char *szKey, + uint32_t uiBufLen, + char *pcBuf +); +const char * hiso_json_get_string_ex(HISO_JSON *pstJson, const char *szKey); + +#endif /* __HIPERISO_JSON_H__ */ + diff --git a/src/gui/Core/hiperiso_log.c b/src/gui/Core/hiperiso_log.c new file mode 100644 index 0000000..f74f8fe --- /dev/null +++ b/src/gui/Core/hiperiso_log.c @@ -0,0 +1,145 @@ +/****************************************************************************** + * hiperiso_log.c ---- hiperiso log + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern char g_log_file[PATH_MAX]; +static int g_hiperiso_log_level = VLOG_DEBUG; +static pthread_mutex_t g_log_mutex; + +int hiperiso_log_init(void) +{ + pthread_mutex_init(&g_log_mutex, NULL); + return 0; +} + +void hiperiso_log_exit(void) +{ + pthread_mutex_destroy(&g_log_mutex); +} + +void hiperiso_set_loglevel(int level) +{ + g_hiperiso_log_level = level; +} + +void hiperiso_syslog_newline(int level, const char *Fmt, ...) +{ + char log[512]; + va_list arg; + time_t stamp; + struct tm ttm; + FILE *fp; + + if (level > g_hiperiso_log_level) + { + return; + } + + time(&stamp); + localtime_r(&stamp, &ttm); + + va_start(arg, Fmt); + vsnprintf(log, 512, Fmt, arg); + va_end(arg); + + pthread_mutex_lock(&g_log_mutex); + fp = fopen(g_log_file, "a+"); + if (fp) + { + fprintf(fp, "[%04u/%02u/%02u %02u:%02u:%02u] %s\n", + ttm.tm_year, ttm.tm_mon, ttm.tm_mday, + ttm.tm_hour, ttm.tm_min, ttm.tm_sec, + log); + fclose(fp); + } + pthread_mutex_unlock(&g_log_mutex); +} + +void hiperiso_syslog_printf(const char *Fmt, ...) +{ + char log[512]; + va_list arg; + time_t stamp; + struct tm ttm; + FILE *fp; + + time(&stamp); + localtime_r(&stamp, &ttm); + + va_start(arg, Fmt); + vsnprintf(log, 512, Fmt, arg); + va_end(arg); + + pthread_mutex_lock(&g_log_mutex); + fp = fopen(g_log_file, "a+"); + if (fp) + { + fprintf(fp, "[%04u/%02u/%02u %02u:%02u:%02u] %s", + ttm.tm_year, ttm.tm_mon, ttm.tm_mday, + ttm.tm_hour, ttm.tm_min, ttm.tm_sec, + log); + fclose(fp); + } + pthread_mutex_unlock(&g_log_mutex); +} + +void hiperiso_syslog(int level, const char *Fmt, ...) +{ + char log[512]; + va_list arg; + time_t stamp; + struct tm ttm; + FILE *fp; + + if (level > g_hiperiso_log_level) + { + return; + } + + time(&stamp); + localtime_r(&stamp, &ttm); + + va_start(arg, Fmt); + vsnprintf(log, 512, Fmt, arg); + va_end(arg); + + pthread_mutex_lock(&g_log_mutex); + fp = fopen(g_log_file, "a+"); + if (fp) + { + fprintf(fp, "[%04u/%02u/%02u %02u:%02u:%02u] %s", + ttm.tm_year + 1900, ttm.tm_mon, ttm.tm_mday, + ttm.tm_hour, ttm.tm_min, ttm.tm_sec, + log); + fclose(fp); + } + pthread_mutex_unlock(&g_log_mutex); +} + diff --git a/src/gui/Core/hiperiso_md5.c b/src/gui/Core/hiperiso_md5.c new file mode 100644 index 0000000..bf0aa2b --- /dev/null +++ b/src/gui/Core/hiperiso_md5.c @@ -0,0 +1,167 @@ +/****************************************************************************** + * hiperiso_md5.c ---- hiperiso md5 + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#include +#include +#include +#include +#include +#include + +const static uint32_t k[64] = +{ + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 +}; + +const static uint32_t r[] = +{ + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 +}; + +#define LEFTROTATE(x, c) (((x) << (c)) | ((x) >> (32 - (c)))) +#define to_bytes(val, bytes) *((uint32_t *)(bytes)) = (val) + +#define ROTATE_CALC() \ +{\ + temp = d; \ + d = c; \ + c = b; \ + b = b + LEFTROTATE((a + f + k[i] + w[g]), r[i]); \ + a = temp; \ +} + +void hiperiso_md5(const void *data, uint32_t len, uint8_t *md5) +{ + uint32_t h0, h1, h2, h3; + uint32_t w[16]; + uint32_t a, b, c, d, i, f, g, temp; + uint32_t offset, mod, delta; + uint8_t postbuf[128] = {0}; + + // Initialize variables - simple count in nibbles: + h0 = 0x67452301; + h1 = 0xefcdab89; + h2 = 0x98badcfe; + h3 = 0x10325476; + + //Pre-processing: + //append "1" bit to message + //append "0" bits until message length in bits ≡ 448 (mod 512) + //append length mod (2^64) to message + + mod = len % 64; + if (mod) + { + memcpy(postbuf, (const uint8_t *)data + len - mod, mod); + } + + postbuf[mod] = 0x80; + if (mod < 56) + { + to_bytes(len * 8, postbuf + 56); + to_bytes(len >> 29, postbuf + 60); + delta = 64; + } + else + { + to_bytes(len * 8, postbuf + 120); + to_bytes(len >> 29, postbuf + 124); + delta = 128; + } + + len -= mod; + + for (offset = 0; offset < len + delta; offset += 64) + { + if (offset < len) + { + memcpy(w, (const uint8_t *)data + offset, 64); + } + else + { + memcpy(w, postbuf + offset - len, 64); + } + + // Initialize hash value for this chunk: + a = h0; + b = h1; + c = h2; + d = h3; + + // Main loop: + for (i = 0; i < 16; i++) + { + f = (b & c) | ((~b) & d); + g = i; + ROTATE_CALC(); + } + + for (i = 16; i < 32; i++) + { + f = (d & b) | ((~d) & c); + g = (5 * i + 1) % 16; + ROTATE_CALC(); + } + + for (i = 32; i < 48; i++) + { + f = b ^ c ^ d; + g = (3 * i + 5) % 16; + ROTATE_CALC(); + } + + for (i = 48; i < 64; i++) + { + f = c ^ (b | (~d)); + g = (7 * i) % 16; + ROTATE_CALC(); + } + + // Add this chunk's hash to result so far: + h0 += a; + h1 += b; + h2 += c; + h3 += d; + } + + //var char md5[16] := h0 append h1 append h2 append h3 //(Output is in little-endian) + to_bytes(h0, md5); + to_bytes(h1, md5 + 4); + to_bytes(h2, md5 + 8); + to_bytes(h3, md5 + 12); +} + diff --git a/src/gui/Core/hiperiso_util.c b/src/gui/Core/hiperiso_util.c new file mode 100644 index 0000000..d8fc90c --- /dev/null +++ b/src/gui/Core/hiperiso_util.c @@ -0,0 +1,646 @@ +/****************************************************************************** + * hiperiso_util.c ---- hiperiso util + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +uint8_t g_mbr_template[512]; + +void hiperiso_gen_preudo_uuid(void *uuid) +{ + int i; + int fd; + + fd = open("/dev/urandom", O_RDONLY | O_BINARY); + if (fd < 0) + { + srand(time(NULL)); + for (i = 0; i < 8; i++) + { + *((uint16_t *)uuid + i) = (uint16_t)(rand() & 0xFFFF); + } + } + else + { + read(fd, uuid, 16); + close(fd); + } +} + +uint64_t hiperiso_get_human_readable_gb(uint64_t SizeBytes) +{ + int i; + int Pow2 = 1; + double Delta; + double GB = SizeBytes * 1.0 / 1000 / 1000 / 1000; + + if ((SizeBytes % SIZE_1GB) == 0) + { + return (uint64_t)(SizeBytes / SIZE_1GB); + } + + for (i = 0; i < 12; i++) + { + if (Pow2 > GB) + { + Delta = (Pow2 - GB) / Pow2; + } + else + { + Delta = (GB - Pow2) / Pow2; + } + + if (Delta < 0.05) + { + return Pow2; + } + + Pow2 <<= 1; + } + + return (uint64_t)GB; +} + + +int hiperiso_get_sys_file_line(char *buffer, int buflen, const char *fmt, ...) +{ + int len; + char c; + char path[256]; + va_list arg; + + va_start(arg, fmt); + vsnprintf(path, 256, fmt, arg); + va_end(arg); + + if (access(path, F_OK) >= 0) + { + FILE *fp = fopen(path, "r"); + memset(buffer, 0, buflen); + len = (int)fread(buffer, 1, buflen - 1, fp); + fclose(fp); + + while (len > 0) + { + c = buffer[len - 1]; + if (c == '\r' || c == '\n' || c == ' ' || c == '\t') + { + buffer[len - 1] = 0; + len--; + } + else + { + break; + } + } + + return 0; + } + else + { + vdebug("%s not exist \n", path); + return 1; + } +} + +int hiperiso_is_disk_mounted(const char *devpath) +{ + int len; + int mount = 0; + char line[512]; + FILE *fp = NULL; + + fp = fopen("/proc/mounts", "r"); + if (!fp) + { + return 0; + } + + len = (int)strlen(devpath); + while (fgets(line, sizeof(line), fp)) + { + if (strncmp(line, devpath, len) == 0) + { + mount = 1; + vdebug("%s mounted <%s>\n", devpath, line); + goto end; + } + } + +end: + fclose(fp); + return mount; +} + +static int hiperiso_mount_path_escape(char *src, char *dst, int len) +{ + int i = 0; + int n = 0; + + dst[len - 1] = 0; + + for (i = 0; i < len - 1; i++) + { + if (src[i] == '\\' && src[i + 1] == '0' && src[i + 2] == '4' && src[i + 3] == '0') + { + dst[n++] = ' '; + i += 3; + } + else + { + dst[n++] = src[i]; + } + + if (src[i] == 0) + { + break; + } + } + + return 0; +} + +int hiperiso_try_umount_disk(const char *devpath) +{ + int rc; + int len; + char line[1024]; + char mntpt[1024]; + char *pos1 = NULL; + char *pos2 = NULL; + FILE *fp = NULL; + + fp = fopen("/proc/mounts", "r"); + if (!fp) + { + return 0; + } + + len = (int)strlen(devpath); + while (fgets(line, sizeof(line), fp)) + { + if (strncmp(line, devpath, len) == 0) + { + pos1 = strchr(line, ' '); + if (pos1) + { + pos2 = strchr(pos1 + 1, ' '); + if (pos2) + { + *pos2 = 0; + } + + hiperiso_mount_path_escape(pos1 + 1, mntpt, sizeof(mntpt)); + rc = umount(mntpt); + if (rc) + { + vdebug("umount <%s> <%s> [ failed ] error:%d\n", devpath, mntpt, errno); + } + else + { + vdebug("umount <%s> <%s> [ success ]\n", devpath, mntpt); + } + } + } + } + + fclose(fp); + return 0; +} + +int hiperiso_read_file_to_buf(const char *FileName, int ExtLen, void **Bufer, int *BufLen) +{ + int FileSize; + FILE *fp = NULL; + void *Data = NULL; + + fp = fopen(FileName, "rb"); + if (fp == NULL) + { + vlog("Failed to open file %s", FileName); + return 1; + } + + fseek(fp, 0, SEEK_END); + FileSize = (int)ftell(fp); + + Data = malloc(FileSize + ExtLen); + if (!Data) + { + fclose(fp); + return 1; + } + + fseek(fp, 0, SEEK_SET); + fread(Data, 1, FileSize, fp); + + fclose(fp); + + *Bufer = Data; + *BufLen = FileSize; + + return 0; +} + +const char * hiperiso_get_local_version(void) +{ + int rc; + int FileSize; + char *Pos = NULL; + char *Buf = NULL; + static char LocalVersion[64] = { 0 }; + + if (LocalVersion[0] == 0) + { + rc = hiperiso_read_file_to_buf("hiperiso/version", 1, (void **)&Buf, &FileSize); + if (rc) + { + return ""; + } + Buf[FileSize] = 0; + + for (Pos = Buf; *Pos; Pos++) + { + if (*Pos == '\r' || *Pos == '\n') + { + *Pos = 0; + break; + } + } + + scnprintf(LocalVersion, "%s", Buf); + free(Buf); + } + + return LocalVersion; +} + +int HiperisoGetLocalBootImg(MBR_HEAD *pMBR) +{ + memcpy(pMBR, g_mbr_template, 512); + return 0; +} + +static int HiperisoFillProtectMBR(uint64_t DiskSizeBytes, MBR_HEAD *pMBR) +{ + hiperiso_guid Guid; + uint32_t DiskSignature; + uint64_t DiskSectorCount; + + HiperisoGetLocalBootImg(pMBR); + + hiperiso_gen_preudo_uuid(&Guid); + + memcpy(&DiskSignature, &Guid, sizeof(uint32_t)); + + vdebug("Disk signature: 0x%08x\n", DiskSignature); + + memcpy(pMBR->BootCode + 0x1B8, &DiskSignature, 4); + memcpy(pMBR->BootCode + 0x180, &Guid, 16); + + DiskSectorCount = DiskSizeBytes / 512 - 1; + if (DiskSectorCount > 0xFFFFFFFF) + { + DiskSectorCount = 0xFFFFFFFF; + } + + memset(pMBR->PartTbl, 0, sizeof(pMBR->PartTbl)); + + pMBR->PartTbl[0].Active = 0x00; + pMBR->PartTbl[0].FsFlag = 0xee; // EE + + pMBR->PartTbl[0].StartHead = 0; + pMBR->PartTbl[0].StartSector = 1; + pMBR->PartTbl[0].StartCylinder = 0; + pMBR->PartTbl[0].EndHead = 254; + pMBR->PartTbl[0].EndSector = 63; + pMBR->PartTbl[0].EndCylinder = 1023; + + pMBR->PartTbl[0].StartSectorId = 1; + pMBR->PartTbl[0].SectorCount = (uint32_t)DiskSectorCount; + + pMBR->Byte55 = 0x55; + pMBR->ByteAA = 0xAA; + + pMBR->BootCode[92] = 0x22; + + return 0; +} + +static int hiperiso_fill_gpt_partname(uint16_t Name[36], const char *asciiName) +{ + int i; + int len; + + memset(Name, 0, 36 * sizeof(uint16_t)); + len = (int)strlen(asciiName); + for (i = 0; i < 36 && i < len; i++) + { + Name[i] = asciiName[i]; + } + + return 0; +} + +int hiperiso_fill_gpt(uint64_t size, uint64_t reserve, int align4k, HISO_GPT_INFO *gpt) +{ + uint64_t ReservedSector = 33; + uint64_t ModSectorCount = 0; + uint64_t Part1SectorCount = 0; + uint64_t DiskSectorCount = size / 512; + HISO_GPT_HDR *Head = &gpt->Head; + HISO_GPT_PART_TBL *Table = gpt->PartTbl; + hiperiso_guid WindowsDataPartType = { 0xebd0a0a2, 0xb9e5, 0x4433, { 0x87, 0xc0, 0x68, 0xb6, 0xb7, 0x26, 0x99, 0xc7 } }; + //hiperiso_guid EspPartType = { 0xc12a7328, 0xf81f, 0x11d2, { 0xba, 0x4b, 0x00, 0xa0, 0xc9, 0x3e, 0xc9, 0x3b } }; + //hiperiso_guid BiosGrubPartType = { 0x21686148, 0x6449, 0x6e6f, { 0x74, 0x4e, 0x65, 0x65, 0x64, 0x45, 0x46, 0x49 } }; + + HiperisoFillProtectMBR(size, &gpt->MBR); + + if (reserve > 0) + { + ReservedSector += reserve / 512; + } + + Part1SectorCount = DiskSectorCount - ReservedSector - (HISOEFI_PART_BYTES / 512) - 2048; + + ModSectorCount = (Part1SectorCount % 8); + if (ModSectorCount) + { + vlog("Part1SectorCount:%llu is not aligned by 4KB (%llu)\n", (_ull)Part1SectorCount, (_ull)ModSectorCount); + } + + // check aligned with 4KB + if (align4k) + { + if (ModSectorCount) + { + vdebug("Disk need to align with 4KB %u\n", (uint32_t)ModSectorCount); + Part1SectorCount -= ModSectorCount; + } + else + { + vdebug("no need to align with 4KB\n"); + } + } + + memcpy(Head->Signature, "EFI PART", 8); + Head->Version[2] = 0x01; + Head->Length = 92; + Head->Crc = 0; + Head->EfiStartLBA = 1; + Head->EfiBackupLBA = DiskSectorCount - 1; + Head->PartAreaStartLBA = 34; + Head->PartAreaEndLBA = DiskSectorCount - 34; + hiperiso_gen_preudo_uuid(&Head->DiskGuid); + Head->PartTblStartLBA = 2; + Head->PartTblTotNum = 128; + Head->PartTblEntryLen = 128; + + + memcpy(&(Table[0].PartType), &WindowsDataPartType, sizeof(hiperiso_guid)); + hiperiso_gen_preudo_uuid(&(Table[0].PartGuid)); + Table[0].StartLBA = 2048; + Table[0].LastLBA = 2048 + Part1SectorCount - 1; + Table[0].Attr = 0; + hiperiso_fill_gpt_partname(Table[0].Name, "Hiperiso"); + + // to fix windows issue + //memcpy(&(Table[1].PartType), &EspPartType, sizeof(GUID)); + memcpy(&(Table[1].PartType), &WindowsDataPartType, sizeof(hiperiso_guid)); + hiperiso_gen_preudo_uuid(&(Table[1].PartGuid)); + Table[1].StartLBA = Table[0].LastLBA + 1; + Table[1].LastLBA = Table[1].StartLBA + HISOEFI_PART_BYTES / 512 - 1; + Table[1].Attr = 0x8000000000000000ULL; + hiperiso_fill_gpt_partname(Table[1].Name, "HISOEFI"); + +#if 0 + memcpy(&(Table[2].PartType), &BiosGrubPartType, sizeof(hiperiso_guid)); + hiperiso_gen_preudo_uuid(&(Table[2].PartGuid)); + Table[2].StartLBA = 34; + Table[2].LastLBA = 2047; + Table[2].Attr = 0; +#endif + + //Update CRC + Head->PartTblCrc = hiperiso_crc32(Table, sizeof(gpt->PartTbl)); + Head->Crc = hiperiso_crc32(Head, Head->Length); + + return 0; +} + +int HiperisoFillMBRLocation(uint64_t DiskSizeInBytes, uint32_t StartSectorId, uint32_t SectorCount, PART_TABLE *Table) +{ + uint8_t Head; + uint8_t Sector; + uint8_t nSector = 63; + uint8_t nHead = 8; + uint32_t Cylinder; + uint32_t EndSectorId; + + while (nHead != 0 && (DiskSizeInBytes / 512 / nSector / nHead) > 1024) + { + nHead = (uint8_t)nHead * 2; + } + + if (nHead == 0) + { + nHead = 255; + } + + Cylinder = StartSectorId / nSector / nHead; + Head = StartSectorId / nSector % nHead; + Sector = StartSectorId % nSector + 1; + + Table->StartHead = Head; + Table->StartSector = Sector; + Table->StartCylinder = Cylinder; + + EndSectorId = StartSectorId + SectorCount - 1; + Cylinder = EndSectorId / nSector / nHead; + Head = EndSectorId / nSector % nHead; + Sector = EndSectorId % nSector + 1; + + Table->EndHead = Head; + Table->EndSector = Sector; + Table->EndCylinder = Cylinder; + + Table->StartSectorId = StartSectorId; + Table->SectorCount = SectorCount; + + return 0; +} + +int hiperiso_fill_mbr(uint64_t size, uint64_t reserve, int align4k, MBR_HEAD *pMBR) +{ + hiperiso_guid Guid; + uint32_t DiskSignature; + uint32_t DiskSectorCount; + uint32_t PartSectorCount; + uint32_t PartStartSector; + uint32_t ReservedSector; + + HiperisoGetLocalBootImg(pMBR); + + hiperiso_gen_preudo_uuid(&Guid); + + memcpy(&DiskSignature, &Guid, sizeof(uint32_t)); + + vdebug("Disk signature: 0x%08x\n", DiskSignature); + + memcpy(pMBR->BootCode + 0x1B8, &DiskSignature, 4); + memcpy(pMBR->BootCode + 0x180, &Guid, 16); + + if (size / 512 > 0xFFFFFFFF) + { + DiskSectorCount = 0xFFFFFFFF; + } + else + { + DiskSectorCount = (uint32_t)(size / 512); + } + + if (reserve <= 0) + { + ReservedSector = 0; + } + else + { + ReservedSector = (uint32_t)(reserve / 512); + } + + // check aligned with 4KB + if (align4k) + { + uint64_t sectors = size / 512; + if (sectors % 8) + { + vlog("Disk need to align with 4KB %u\n", (uint32_t)(sectors % 8)); + ReservedSector += (uint32_t)(sectors % 8); + } + else + { + vdebug("no need to align with 4KB\n"); + } + } + + vlog("ReservedSector: %u\n", ReservedSector); + + //Part1 + PartStartSector = HISOIMG_PART_START_SECTOR; + PartSectorCount = DiskSectorCount - ReservedSector - HISOEFI_PART_BYTES / 512 - PartStartSector; + HiperisoFillMBRLocation(size, PartStartSector, PartSectorCount, pMBR->PartTbl); + + pMBR->PartTbl[0].Active = 0x80; // bootable + pMBR->PartTbl[0].FsFlag = 0x07; // exFAT/NTFS/HPFS + + //Part2 + PartStartSector += PartSectorCount; + PartSectorCount = HISOEFI_PART_BYTES / 512; + HiperisoFillMBRLocation(size, PartStartSector, PartSectorCount, pMBR->PartTbl + 1); + + pMBR->PartTbl[1].Active = 0x00; + pMBR->PartTbl[1].FsFlag = 0xEF; // EFI System Partition + + pMBR->Byte55 = 0x55; + pMBR->ByteAA = 0xAA; + + return 0; +} + +int hiperiso_fill_mbr_4k(uint64_t size, uint64_t reserve, int align4k, MBR_HEAD *pMBR) +{ + hiperiso_guid Guid; + uint32_t DiskSignature; + uint32_t DiskSectorCount; + uint32_t PartSectorCount; + uint32_t PartStartSector; + uint32_t ReservedSector; + + HiperisoGetLocalBootImg(pMBR); + + hiperiso_gen_preudo_uuid(&Guid); + + memcpy(&DiskSignature, &Guid, sizeof(uint32_t)); + + vdebug("Disk signature: 0x%08x\n", DiskSignature); + + memcpy(pMBR->BootCode + 0x1B8, &DiskSignature, 4); + memcpy(pMBR->BootCode + 0x180, &Guid, 16); + + if (size / 4096 > 0xFFFFFFFF) + { + DiskSectorCount = 0xFFFFFFFF; + } + else + { + DiskSectorCount = (uint32_t)(size / 4096); + } + + if (reserve <= 0) + { + ReservedSector = 0; + } + else + { + ReservedSector = (uint32_t)(reserve / 4096); + } + + // check aligned with 4KB + vdebug("no need to align with 4KB for 4K native disk\n"); + + vlog("ReservedSector: %u\n", ReservedSector); + + //Part1 + PartStartSector = HISOIMG_PART_START_SECTOR >> 3; + PartSectorCount = DiskSectorCount - ReservedSector - HISOEFI_PART_BYTES / 4096 - PartStartSector; + HiperisoFillMBRLocation(size, PartStartSector, PartSectorCount, pMBR->PartTbl); + + pMBR->PartTbl[0].Active = 0x80; // bootable + pMBR->PartTbl[0].FsFlag = 0x07; // exFAT/NTFS/HPFS + + //Part2 + PartStartSector += PartSectorCount; + PartSectorCount = HISOEFI_PART_BYTES / 4096; + HiperisoFillMBRLocation(size, PartStartSector, PartSectorCount, pMBR->PartTbl + 1); + + pMBR->PartTbl[1].Active = 0x00; + pMBR->PartTbl[1].FsFlag = 0xEF; // EFI System Partition + + pMBR->Byte55 = 0x55; + pMBR->ByteAA = 0xAA; + + return 0; +} + diff --git a/src/gui/Core/hiperiso_util.h b/src/gui/Core/hiperiso_util.h new file mode 100644 index 0000000..0872557 --- /dev/null +++ b/src/gui/Core/hiperiso_util.h @@ -0,0 +1,57 @@ +/****************************************************************************** + * hiperiso_util.h + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#ifndef __HIPERISO_UTIL_H__ +#define __HIPERISO_UTIL_H__ + +extern char g_log_file[PATH_MAX]; +extern char g_ini_file[PATH_MAX]; + +#define check_free(p) if (p) free(p) +#define hiso_safe_close_fd(fd) \ +{\ + if ((fd) >= 0) \ + { \ + close(fd); \ + (fd) = -1; \ + }\ +} + +extern uint8_t g_mbr_template[512]; +void hiperiso_gen_preudo_uuid(void *uuid); +int hiperiso_get_disk_part_name(const char *dev, int part, char *partbuf, int bufsize); +int hiperiso_get_sys_file_line(char *buffer, int buflen, const char *fmt, ...); +uint64_t hiperiso_get_human_readable_gb(uint64_t SizeBytes); +void hiperiso_md5(const void *data, uint32_t len, uint8_t *md5); +int hiperiso_is_disk_mounted(const char *devpath); +int hiperiso_try_umount_disk(const char *devpath); +int unxz(unsigned char *in, int in_size, + int (*fill)(void *dest, unsigned int size), + int (*flush)(void *src, unsigned int size), + unsigned char *out, int *in_used, + void (*error)(char *x)); +int hiperiso_read_file_to_buf(const char *FileName, int ExtLen, void **Bufer, int *BufLen); +const char * hiperiso_get_local_version(void); +int hiperiso_fill_gpt(uint64_t size, uint64_t reserve, int align4k, HISO_GPT_INFO *gpt); +int hiperiso_fill_mbr(uint64_t size, uint64_t reserve, int align4k, MBR_HEAD *pMBR); +int HiperisoGetLocalBootImg(MBR_HEAD *pMBR); +int hiperiso_fill_mbr_4k(uint64_t size, uint64_t reserve, int align4k, MBR_HEAD *pMBR); + +#endif /* __HIPERISO_UTIL_H__ */ + diff --git a/src/gui/GTK/hiperiso_gtk.c b/src/gui/GTK/hiperiso_gtk.c new file mode 100644 index 0000000..c2348b4 --- /dev/null +++ b/src/gui/GTK/hiperiso_gtk.c @@ -0,0 +1,1510 @@ +/****************************************************************************** + * hiperiso_gtk.c + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include "hiperiso_gtk.h" + +int g_secure_boot_support = 0; +GtkWidget *g_topWindow = NULL; +GtkWidget *g_partCfgWindow = NULL; +GtkBuilder *g_pXmlBuilder = NULL; +GtkComboBoxText *g_dev_combobox = NULL; +GtkButton *g_refresh_button = NULL; +GtkButton *g_install_button = NULL; +GtkButton *g_update_button = NULL; +GtkMenu *g_lang_menu = NULL;; +GtkCheckMenuItem *g_menu_item_secure_boot = NULL; +GtkCheckMenuItem *g_menu_item_mbr = NULL; +GtkCheckMenuItem *g_menu_item_gpt = NULL; +GtkCheckMenuItem *g_menu_item_show_all = NULL; +GtkLabel *g_device_title = NULL; +GtkLabel *g_label_local_part_style = NULL; +GtkLabel *g_label_dev_part_style = NULL; +GtkLabel *g_label_local_ver = NULL; +GtkLabel *g_label_disk_ver = NULL; +GtkLabel *g_label_status = NULL; +GtkImage *g_image_secure_local = NULL; +GtkImage *g_image_secure_device = NULL; +GtkToggleButton *g_part_align_checkbox = NULL; +GtkToggleButton *g_part_preserve_checkbox = NULL; +GtkEntry *g_part_reserve_space_value = NULL; +GtkComboBoxText *g_part_space_unit_combox = NULL; +GtkComboBoxText *g_part_fs_type_combox = NULL; +GtkEntry *g_part_cluster_size_value = NULL; +GtkProgressBar *g_progress_bar = NULL; +HISO_JSON *g_languages_json = NULL; +int g_languages_toggled_proc = 0; +int g_dev_changed_proc = 0; +gboolean g_align_part_with_4k = TRUE; +gboolean g_preserve_space_check = FALSE; +int g_preserve_space_unit = 1; +int g_preserve_space_number = 0; +int g_fs_type = 0; +int g_cluster_size = 0; +gboolean g_thread_run = FALSE; + +typedef struct gtk_worker_ctx +{ + int op_type; + int index; + int ret; + char disk_name[32]; +} gtk_worker_ctx; + +#define GTK_OP_INSTALL 1 +#define GTK_OP_UPDATE 2 +#define GTK_OP_INSTALL_NONDESTR 3 + +const char *language_string(const char *id) +{ + const char *pName = NULL; + HISO_JSON *node = NULL; + const char *pCurLang = hiperiso_code_get_cur_language(); + + for (node = g_languages_json->pstChild; node; node = node->pstNext) + { + pName = hiso_json_get_string_ex(node->pstChild, "name"); + if (0 == g_strcmp0(pName, pCurLang)) + { + break; + } + } + + if (NULL == node) + { + return "xxx"; + } + + return hiso_json_get_string_ex(node->pstChild, id); +} + +int msgbox(GtkMessageType type, GtkButtonsType buttons, const char *strid) +{ + int ret; + GtkWidget *pMsgBox = NULL; + + pMsgBox = gtk_message_dialog_new(GTK_WINDOW(g_topWindow), GTK_DIALOG_MODAL, type, buttons, "%s", language_string(strid)); + + ret = gtk_dialog_run(GTK_DIALOG(pMsgBox)); + gtk_widget_destroy(pMsgBox); + + return ret; +} + + +static void set_item_visible(const char *id, int visible) +{ + GtkWidget *pWidget = NULL; + + pWidget = GTK_WIDGET(gtk_builder_get_object(g_pXmlBuilder, id)); + if (visible) + { + gtk_widget_show(pWidget); + } + else + { + gtk_widget_hide(pWidget); + } +} + +static void init_part_style_menu(void) +{ + int style; + + style = hiperiso_code_get_cur_part_style(); + gtk_check_menu_item_set_active(g_menu_item_mbr, (0 == style)); + gtk_check_menu_item_set_active(g_menu_item_gpt, (1 == style)); + gtk_label_set_text(g_label_local_part_style, style ? "GPT" : "MBR"); +} + +static void select_language(const char *lang) +{ + const char *pName = NULL; + const char *pPos = NULL; + const char *pDevice = NULL; + HISO_JSON *node = NULL; + char device[256]; + + for (node = g_languages_json->pstChild; node; node = node->pstNext) + { + pName = hiso_json_get_string_ex(node->pstChild, "name"); + if (0 == g_strcmp0(pName, lang)) + { + break; + } + } + + if (NULL == node) + { + return; + } + + pDevice = gtk_label_get_text(g_device_title); + if (pDevice && (pPos = strchr(pDevice, '[')) != NULL) + { + g_snprintf(device, sizeof(device), "%s %s", hiso_json_get_string_ex(node->pstChild, "STR_DEVICE"), pPos); + gtk_label_set_text(g_device_title, device); + } + else + { + gtk_label_set_text(g_device_title, hiso_json_get_string_ex(node->pstChild, "STR_DEVICE")); + } + + LANG_LABEL_TEXT("label_local_ver", "STR_LOCAL_VER"); + LANG_LABEL_TEXT("label_device_ver", "STR_DISK_VER"); + + LANG_LABEL_TEXT("label_status", "STR_STATUS"); + + LANG_BUTTON_TEXT("button_install", "STR_INSTALL"); + LANG_BUTTON_TEXT("button_update", "STR_UPDATE"); + + LANG_MENU_ITEM_TEXT("menu_option", "STR_MENU_OPTION"); + LANG_MENU_ITEM_TEXT("menu_item_secure", "STR_MENU_SECURE_BOOT"); + LANG_MENU_ITEM_TEXT("menu_part_style", "STR_MENU_PART_STYLE"); + LANG_MENU_ITEM_TEXT("menu_item_part_cfg", "STR_MENU_PART_CFG"); + LANG_MENU_ITEM_TEXT("menu_item_clear", "STR_MENU_CLEAR"); + LANG_MENU_ITEM_TEXT("menu_item_part_resize", "STR_MENU_PART_RESIZE"); + LANG_MENU_ITEM_TEXT("menu_item_show_all", "STR_SHOW_ALL_DEV"); + LANG_MENU_ITEM_TEXT("menu_help", "STR_MENU_HELP"); + LANG_MENU_ITEM_TEXT("menu_item_about", "STR_ABOUT"); + + LANG_BUTTON_TEXT("space_check_btn", "STR_PRESERVE_SPACE"); + LANG_BUTTON_TEXT("space_align_btn", "STR_PART_ALIGN_4KB"); + LANG_LABEL_TEXT("label_fs_type", "STR_FS_TYPE"); + LANG_LABEL_TEXT("label_cluster_size", "STR_CLUSTER_SIZE"); + LANG_BUTTON_TEXT("button_partcfg_ok", "STR_BTN_OK"); + LANG_BUTTON_TEXT("button_partcfg_cancel", "STR_BTN_CANCEL"); + + gtk_window_set_title(GTK_WINDOW(g_partCfgWindow), hiso_json_get_string_ex(node->pstChild, "STR_MENU_PART_CFG")); + + gtk_widget_queue_draw(g_topWindow); +} + + +void on_secure_boot_toggled(GtkMenuItem *menuItem, gpointer data) +{ + g_secure_boot_support = 1 - g_secure_boot_support; + + if (g_secure_boot_support) + { + gtk_widget_show((GtkWidget *)g_image_secure_local); + } + else + { + gtk_widget_hide((GtkWidget *)g_image_secure_local); + } +} + +void on_devlist_changed(GtkWidget *widget, gpointer data) +{ + int active; + hiperiso_disk *cur = NULL; + char version[512]; + + if (g_dev_changed_proc == 0) + { + return; + } + + gtk_widget_set_sensitive(GTK_WIDGET(g_update_button), FALSE); + + gtk_widget_hide((GtkWidget *)g_image_secure_device); + gtk_label_set_markup(g_label_disk_ver, ""); + gtk_label_set_text(g_label_dev_part_style, ""); + + active = gtk_combo_box_get_active((GtkComboBox *)g_dev_combobox); + if (active < 0 || active >= g_disk_num) + { + vlog("invalid active combox id %d\n", active); + return; + } + + cur = g_disk_list + active; + if (cur->hisodata.hiperiso_valid) + { + if (cur->hisodata.secure_boot_flag) + { + gtk_widget_show((GtkWidget *)g_image_secure_device); + } + else + { + gtk_widget_hide((GtkWidget *)g_image_secure_device); + } + + if (g_secure_boot_support != cur->hisodata.secure_boot_flag) + { + gtk_check_menu_item_set_active(g_menu_item_secure_boot, 1 - g_secure_boot_support); + } + + g_snprintf(version, sizeof(version), HISO_VER_FMT, cur->hisodata.hiperiso_ver); + gtk_label_set_markup(g_label_disk_ver, version); + gtk_label_set_text(g_label_dev_part_style, cur->hisodata.partition_style ? "GPT" : "MBR"); + + gtk_widget_set_sensitive(GTK_WIDGET(g_update_button), TRUE); + } + else + { + if (!g_secure_boot_support) + { + gtk_check_menu_item_set_active(g_menu_item_secure_boot, 1 - g_secure_boot_support); + } + } +} + + +void on_language_toggled(GtkMenuItem *menuItem, gpointer data) +{ + const char *cur_lang = NULL; + + if (g_languages_toggled_proc == 0) + { + return; + } + + cur_lang = hiperiso_code_get_cur_language(); + if (g_strcmp0(cur_lang, (char *)data) != 0) + { + hiperiso_code_set_cur_language((char *)data); + select_language((char *)data); + } +} + +void on_part_style_toggled(GtkMenuItem *menuItem, gpointer data) +{ + int style; + + style = hiperiso_code_get_cur_part_style(); + hiperiso_code_set_cur_part_style(1 - style); + style = hiperiso_code_get_cur_part_style(); + + gtk_label_set_text(g_label_local_part_style, style ? "GPT" : "MBR"); +} + +static hiperiso_disk *select_active_dev(const char *select, int *activeid) +{ + int i; + int alldev; + hiperiso_disk *cur = NULL; + + alldev = hiperiso_code_get_cur_show_all(); + + /* find the match one */ + if (select) + { + for (i = 0; i < g_disk_num; i++) + { + cur = g_disk_list + i; + if (alldev == 0 && cur->type != HISO_DEVICE_USB) + { + continue; + } + + if (strcmp(cur->disk_name, select) == 0) + { + *activeid = i; + return cur; + } + } + } + + /* find the first one that installed with Hiperiso */ + for (i = 0; i < g_disk_num; i++) + { + cur = g_disk_list + i; + if (alldev == 0 && cur->type != HISO_DEVICE_USB) + { + continue; + } + + if (cur->hisodata.hiperiso_valid) + { + *activeid = i; + return cur; + } + } + + /* find the first USB interface device */ + for (i = 0; i < g_disk_num; i++) + { + cur = g_disk_list + i; + if (alldev == 0 && cur->type != HISO_DEVICE_USB) + { + continue; + } + + if (cur->type == HISO_DEVICE_USB) + { + *activeid = i; + return cur; + } + } + + /* use the first one */ + for (i = 0; i < g_disk_num; i++) + { + cur = g_disk_list + i; + if (alldev == 0 && cur->type != HISO_DEVICE_USB) + { + continue; + } + + *activeid = i; + return cur; + } + + return NULL; +} + +static void fill_dev_list(const char *select) +{ + int i; + int alldev; + int activeid; + int count = 0; + char line[512]; + hiperiso_disk *cur = NULL; + hiperiso_disk *active = NULL; + GtkListStore *store = NULL; + + g_dev_changed_proc = 0; + + alldev = hiperiso_code_get_cur_show_all(); + + vlog("fill_dev_list total disk: %d showall:%d\n", g_disk_num, alldev); + + /* gtk_combo_box_text_remove_all */ + store = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(g_dev_combobox))); + gtk_list_store_clear(store); + + for (i = 0; i < g_disk_num; i++) + { + cur = g_disk_list + i; + + if (alldev == 0 && cur->type != HISO_DEVICE_USB) + { + continue; + } + + g_snprintf(line, sizeof(line), "%s [%s] %s", cur->disk_name, cur->human_readable_size, cur->disk_model); + { + char idbuf[16]; + g_snprintf(idbuf, sizeof(idbuf), "%d", i); + gtk_combo_box_text_append(g_dev_combobox, idbuf, line); + } + count++; + } + + active = select_active_dev(select, &activeid); + if (active) + { + char idbuf[16]; + vlog("combox count:%d, active:%s id:%d\n", count, active->disk_name, activeid); + g_snprintf(idbuf, sizeof(idbuf), "%d", activeid); + gtk_combo_box_set_active_id((GtkComboBox *)g_dev_combobox, idbuf); + gtk_widget_set_sensitive(GTK_WIDGET(g_install_button), TRUE); + gtk_widget_set_sensitive(GTK_WIDGET(g_update_button), active->hisodata.hiperiso_valid); + } + else + { + vlog("combox count:%d, no active id\n", count); + gtk_widget_set_sensitive(GTK_WIDGET(g_install_button), FALSE); + gtk_widget_set_sensitive(GTK_WIDGET(g_update_button), FALSE); + } + + g_dev_changed_proc = 1; + on_devlist_changed(NULL, NULL); +} + + +void on_show_all_toggled(GtkMenuItem *menuItem, gpointer data) +{ + int show_all = hiperiso_code_get_cur_show_all(); + + hiperiso_code_set_cur_show_all(1 - show_all); + fill_dev_list(NULL); +} + +void on_button_refresh_clicked(GtkWidget *widget, gpointer data) +{ + if (g_thread_run || hiperiso_code_is_busy()) + { + msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "STR_WAIT_PROCESS"); + return; + } + + hiperiso_code_refresh_device(); + fill_dev_list(NULL); +} + +static void set_progress_bar_percent(int percent) +{ + const char *text = NULL; + char tmp[128]; + + gtk_progress_bar_set_fraction(g_progress_bar, percent * 1.0 / 100); + vlog("set percent %d\n", percent); + + text = language_string("STR_STATUS"); + if (percent == 0) + { + gtk_label_set_text(g_label_status, text); + } + else + { + g_snprintf(tmp, sizeof(tmp), "%s %d%%", text, percent); + gtk_label_set_text(g_label_status, tmp); + } +} + +static gboolean gtk_progress_idle(gpointer data) +{ + set_progress_bar_percent(GPOINTER_TO_INT(data)); + return FALSE; +} + +static gboolean gtk_finish_worker_idle(gpointer data) +{ + gtk_worker_ctx *ctx = (gtk_worker_ctx *)data; + + if (ctx->op_type == GTK_OP_INSTALL || ctx->op_type == GTK_OP_INSTALL_NONDESTR) + { + if (ctx->ret) + { + msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "STR_INSTALL_FAILED"); + } + else + { + msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "STR_INSTALL_SUCCESS"); + } + } + else + { + if (ctx->ret) + { + msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "STR_UPDATE_FAILED"); + } + else + { + msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "STR_UPDATE_SUCCESS"); + } + } + + set_progress_bar_percent(0); + gtk_widget_set_sensitive(GTK_WIDGET(g_refresh_button), TRUE); + gtk_widget_set_sensitive(GTK_WIDGET(g_install_button), TRUE); + gtk_widget_set_sensitive(GTK_WIDGET(g_update_button), TRUE); + fill_dev_list(ctx->disk_name); + g_thread_run = FALSE; + g_free(ctx); + return FALSE; +} + +void on_about(GtkMenuItem *menuItem, gpointer data) +{ + GtkWidget *pDlg = NULL; + char *markup = NULL; + + pDlg = gtk_message_dialog_new(GTK_WINDOW(g_topWindow), GTK_DIALOG_MODAL, + GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "%s", ""); + gtk_window_set_title(GTK_WINDOW(pDlg), "About Hiperiso"); + + markup = g_markup_printf_escaped( + "Hiperiso v%s\n\n" + "A hypervisor-based ISO boot tool with full boot logging.\n" + "Based on the Ventoy project.\n\n" + "%s", + hiperiso_get_local_version(), + "https://github.com/hiperiso/hiperiso"); + + gtk_message_dialog_set_markup(GTK_MESSAGE_DIALOG(pDlg), markup); + g_free(markup); + + gtk_dialog_run(GTK_DIALOG(pDlg)); + gtk_widget_destroy(pDlg); +} + +void on_clear_hiperiso(GtkMenuItem *menuItem, gpointer data) +{ + int ret; + int active; + char *active_id = NULL; + char buf[1024]; + char out[256]; + char disk_name[32]; + hiperiso_disk *cur = NULL; + + if (g_thread_run || hiperiso_code_is_busy()) + { + msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "STR_WAIT_PROCESS"); + return; + } + + active_id = gtk_combo_box_get_active_id((GtkComboBox *)g_dev_combobox); + active = active_id ? atoi(active_id) : -1; + g_free(active_id); + if (active < 0 || active >= g_disk_num) + { + vlog("invalid active combox id %d\n", active); + return; + } + + if (GTK_RESPONSE_OK != msgbox(GTK_MESSAGE_WARNING, GTK_BUTTONS_OK_CANCEL, "STR_INSTALL_TIP")) + { + return; + } + + if (GTK_RESPONSE_OK != msgbox(GTK_MESSAGE_WARNING, GTK_BUTTONS_OK_CANCEL, "STR_INSTALL_TIP2")) + { + return; + } + + gtk_widget_set_sensitive (GTK_WIDGET(g_refresh_button), FALSE); + gtk_widget_set_sensitive (GTK_WIDGET(g_install_button), FALSE); + gtk_widget_set_sensitive (GTK_WIDGET(g_update_button), FALSE); + g_thread_run = TRUE; + + + cur = g_disk_list + active; + g_snprintf(disk_name, sizeof(disk_name), "%s", cur->disk_name); + g_snprintf(buf, sizeof(buf), "{\"method\":\"clean\",\"disk\":\"%s\"}", disk_name); + + out[0] = 0; + hiperiso_func_handler(buf, out, sizeof(out)); + vlog("func handler clean <%s>\n", out); + + if (strstr(out, "success")) + { + ret = hiperiso_code_get_result(); + hiperiso_code_refresh_device(); + cur = NULL; + } + else + { + ret = 1; + } + + if (ret == 0) + { + msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "STR_CLEAR_SUCCESS"); + } + else + { + msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "STR_CLEAR_FAILED"); + } + + set_progress_bar_percent(0); + gtk_widget_set_sensitive(GTK_WIDGET(g_refresh_button), TRUE); + gtk_widget_set_sensitive(GTK_WIDGET(g_install_button), TRUE); + gtk_widget_set_sensitive(GTK_WIDGET(g_update_button), TRUE); + + fill_dev_list(disk_name); + g_thread_run = FALSE; +} + +static int install_proc(hiperiso_disk *cur, char *disk_name, size_t disk_name_len) +{ + int ret = 0; + int pos = 0; + int buflen = 0; + int percent = 0; + char buf[1024]; + char dec[64]; + char out[256]; + long long space; + + vlog("install_thread ...\n"); + + g_snprintf(disk_name, disk_name_len, "%s", cur->disk_name); + + buflen = sizeof(buf); + HISO_JSON_FMT_BEGIN(pos, buf, buflen); + HISO_JSON_FMT_OBJ_BEGIN(); + HISO_JSON_FMT_STRN("method", "install"); + HISO_JSON_FMT_STRN("disk", disk_name); + + if (g_preserve_space_check) + { + space = g_preserve_space_number; + if (g_preserve_space_unit == 1) + { + space = space * 1024 * 1024 * 1024LL; + } + else + { + space = space * 1024 * 1024LL; + } + + snprintf(dec, sizeof(dec), "%lld", space); + HISO_JSON_FMT_STRN("reserve_space", dec); + } + else + { + HISO_JSON_FMT_STRN("reserve_space", "0"); + } + + HISO_JSON_FMT_UINT("partstyle", hiperiso_code_get_cur_part_style()); + HISO_JSON_FMT_UINT("secure_boot", g_secure_boot_support); + HISO_JSON_FMT_UINT("align_4kb", g_align_part_with_4k); + HISO_JSON_FMT_UINT("fs_type", g_fs_type); + HISO_JSON_FMT_UINT("cluster_sectors", g_cluster_size); + HISO_JSON_FMT_OBJ_END(); + HISO_JSON_FMT_END(pos); + + out[0] = 0; + hiperiso_func_handler(buf, out, sizeof(out)); + vlog("func handler install <%s>\n", out); + + if (strstr(out, "success")) + { + while (percent != 100) + { + percent = hiperiso_code_get_percent(); + g_idle_add(gtk_progress_idle, GINT_TO_POINTER(percent)); + usleep(50 * 1000); + } + + ret = hiperiso_code_get_result(); + hiperiso_code_refresh_device(); + cur = NULL; + } + else + { + ret = 1; + } + + return 0; +} + +static gpointer gtk_install_thread(gpointer data) +{ + gtk_worker_ctx *ctx = (gtk_worker_ctx *)data; + ctx->ret = install_proc(g_disk_list + ctx->index, ctx->disk_name, sizeof(ctx->disk_name)); + g_idle_add(gtk_finish_worker_idle, ctx); + return NULL; +} + +void on_button_install_clicked(GtkWidget *widget, gpointer data) +{ + int active; + long long size; + long long space; + char *active_id = NULL; + hiperiso_disk *cur = NULL; + + if (g_thread_run || hiperiso_code_is_busy()) + { + msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "STR_WAIT_PROCESS"); + return; + } + + active_id = gtk_combo_box_get_active_id((GtkComboBox *)g_dev_combobox); + active = active_id ? atoi(active_id) : -1; + g_free(active_id); + if (active < 0 || active >= g_disk_num) + { + vlog("invalid active combox id %d\n", active); + return; + } + + cur = g_disk_list + active; + + if (cur->is4kn) + { + msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "STR_4KN_UNSUPPORTED"); + return; + } + + if (hiperiso_code_get_cur_part_style() == 0 && cur->size_in_byte > 2199023255552ULL) + { + msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "STR_DISK_2TB_MBR_ERROR"); + return; + } + + if (g_preserve_space_check) + { + space = g_preserve_space_number; + if (g_preserve_space_unit == 1) + { + space = space * 1024; + } + else + { + space = space; + } + + size = cur->size_in_byte / SIZE_1MB; + if (size <= space || (size - space) <= (HISOEFI_PART_BYTES / SIZE_1MB)) + { + msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "STR_SPACE_VAL_INVALID"); + vlog("reserved space value too big ...\n"); + return; + } + } + + if (GTK_RESPONSE_OK != msgbox(GTK_MESSAGE_WARNING, GTK_BUTTONS_OK_CANCEL, "STR_INSTALL_TIP")) + { + return; + } + + if (GTK_RESPONSE_OK != msgbox(GTK_MESSAGE_WARNING, GTK_BUTTONS_OK_CANCEL, "STR_INSTALL_TIP2")) + { + return; + } + + gtk_widget_set_sensitive (GTK_WIDGET(g_refresh_button), FALSE); + gtk_widget_set_sensitive (GTK_WIDGET(g_install_button), FALSE); + gtk_widget_set_sensitive (GTK_WIDGET(g_update_button), FALSE); + + g_thread_run = TRUE; + + { + gtk_worker_ctx *ctx = g_new0(gtk_worker_ctx, 1); + ctx->op_type = GTK_OP_INSTALL; + ctx->index = active; + g_thread_new("hiperiso-install", gtk_install_thread, ctx); + } +} + + +static int update_proc(hiperiso_disk *cur, char *disk_name, size_t disk_name_len) +{ + int ret = 0; + int percent = 0; + char buf[1024]; + char out[256]; + + g_snprintf(disk_name, disk_name_len, "%s", cur->disk_name); + g_snprintf(buf, sizeof(buf), "{\"method\":\"update\",\"disk\":\"%s\",\"secure_boot\":%d}", + disk_name, g_secure_boot_support); + + out[0] = 0; + hiperiso_func_handler(buf, out, sizeof(out)); + vlog("func handler update <%s>\n", out); + + if (strstr(out, "success")) + { + while (percent != 100) + { + percent = hiperiso_code_get_percent(); + g_idle_add(gtk_progress_idle, GINT_TO_POINTER(percent)); + usleep(50 * 1000); + } + + ret = hiperiso_code_get_result(); + hiperiso_code_refresh_device(); + cur = NULL; + } + else + { + ret = 1; + } + + return 0; +} + +static gpointer gtk_update_thread(gpointer data) +{ + gtk_worker_ctx *ctx = (gtk_worker_ctx *)data; + ctx->ret = update_proc(g_disk_list + ctx->index, ctx->disk_name, sizeof(ctx->disk_name)); + g_idle_add(gtk_finish_worker_idle, ctx); + return NULL; +} + + +static int part_resize_proc(hiperiso_disk *cur, char *disk_name, size_t disk_name_len) +{ + int ret = 0; + char cmd[512]; + char buf[256]; + + g_snprintf(disk_name, disk_name_len, "%s", cur->disk_name); + g_snprintf(cmd, sizeof(cmd), "echo y | sh ./tool/HiperisoWorker.sh -i -n %s 2>&1", disk_name); + + FILE *fp = popen(cmd, "r"); + if (!fp) + { + return 1; + } + + while (fgets(buf, sizeof(buf), fp)) + { + vlog("%s", buf); + } + + ret = pclose(fp); + ret = WEXITSTATUS(ret); + + hiperiso_code_refresh_device(); + return ret; +} + +static gpointer gtk_install_nondestr_thread(gpointer data) +{ + gtk_worker_ctx *ctx = (gtk_worker_ctx *)data; + ctx->ret = part_resize_proc(g_disk_list + ctx->index, ctx->disk_name, sizeof(ctx->disk_name)); + g_idle_add(gtk_finish_worker_idle, ctx); + return NULL; +} + +void on_menu_part_resize(GtkMenuItem *menuItem, gpointer data) +{ + int active; + char *active_id = NULL; + hiperiso_disk *cur = NULL; + + if (g_thread_run || hiperiso_code_is_busy()) + { + msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "STR_WAIT_PROCESS"); + return; + } + + active_id = gtk_combo_box_get_active_id((GtkComboBox *)g_dev_combobox); + active = active_id ? atoi(active_id) : -1; + g_free(active_id); + if (active < 0 || active >= g_disk_num) + { + vlog("invalid active combox id %d\n", active); + return; + } + + cur = g_disk_list + active; + + if (GTK_RESPONSE_OK != msgbox(GTK_MESSAGE_WARNING, GTK_BUTTONS_OK_CANCEL, "STR_PART_RESIZE_TIP")) + { + return; + } + + gtk_widget_set_sensitive(GTK_WIDGET(g_refresh_button), FALSE); + gtk_widget_set_sensitive(GTK_WIDGET(g_install_button), FALSE); + gtk_widget_set_sensitive(GTK_WIDGET(g_update_button), FALSE); + + g_thread_run = TRUE; + + { + gtk_worker_ctx *ctx = g_new0(gtk_worker_ctx, 1); + ctx->op_type = GTK_OP_INSTALL_NONDESTR; + ctx->index = active; + g_thread_new("hiperiso-nondestr", gtk_install_nondestr_thread, ctx); + } +} + + +void on_button_update_clicked(GtkWidget *widget, gpointer data) +{ + int active; + char *active_id = NULL; + hiperiso_disk *cur = NULL; + + if (g_thread_run || hiperiso_code_is_busy()) + { + msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "STR_WAIT_PROCESS"); + return; + } + + active_id = gtk_combo_box_get_active_id((GtkComboBox *)g_dev_combobox); + active = active_id ? atoi(active_id) : -1; + g_free(active_id); + if (active < 0 || active >= g_disk_num) + { + vlog("invalid active combox id %d\n", active); + return; + } + cur = g_disk_list + active; + + if (cur->hisodata.hiperiso_valid == 0) + { + vlog("invalid hiperiso version.\n"); + return; + } + + if (GTK_RESPONSE_OK != msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK_CANCEL, "STR_UPDATE_TIP")) + { + return; + } + + gtk_widget_set_sensitive (GTK_WIDGET(g_refresh_button), FALSE); + gtk_widget_set_sensitive (GTK_WIDGET(g_install_button), FALSE); + gtk_widget_set_sensitive (GTK_WIDGET(g_update_button), FALSE); + + g_thread_run = TRUE; + + { + gtk_worker_ctx *ctx = g_new0(gtk_worker_ctx, 1); + ctx->op_type = GTK_OP_UPDATE; + ctx->index = active; + g_thread_new("hiperiso-update", gtk_update_thread, ctx); + } +} + +static gint lang_compare(gconstpointer a, gconstpointer b) +{ + const char *name1 = (const char *)a; + const char *name2 = (const char *)b; + + if (strncmp(name1, "Chinese Simplified", 18) == 0) + { + return -1; + } + else if (strncmp(name2, "Chinese Simplified", 18) == 0) + { + return 1; + } + else + { + return g_strcmp0(name1, name2); + } +} + +static int load_languages(void) +{ + int size = 0; + char *pBuf = NULL; + char *pCur = NULL; + const char *pCurLang = NULL; + const char *pName = NULL; + HISO_JSON *json = NULL; + HISO_JSON *node = NULL; + HISO_JSON *lang = NULL; + GSList *pGroup = NULL; + GList *pNameNode = NULL; + GList *pNameList = NULL; + GtkRadioMenuItem *pItem = NULL; + + vlog("load_languages ...\n"); + + pCurLang = hiperiso_code_get_cur_language(); + if (pCurLang[0] == 0) + { + pName = getenv("LANG"); + if (pName && strncmp(pName, "zh_CN", 5) == 0) + { + hiperiso_code_set_cur_language("Chinese Simplified (简体中文)"); + } + else + { + hiperiso_code_set_cur_language("English (English)"); + } + pCurLang = hiperiso_code_get_cur_language(); + } + + vlog("current language <%s>\n", pCurLang); + + if (hiperiso_read_file_to_buf("./tool/languages.json", 1, (void **)&pBuf, &size) != 0 || !pBuf || size <= 0) + { + vlog("load_languages: ./tool/languages.json missing or empty\n"); + return 1; + } + + json = hiso_json_create(); + if (hiso_json_parse(json, pBuf) != JSON_SUCCESS) + { + vlog("load_languages: failed to parse languages.json\n"); + free(pBuf); + hiso_json_destroy(json); + return 1; + } + g_languages_json = json; + + for (node = json->pstChild; node; node = node->pstNext) + { + pName = hiso_json_get_string_ex(node->pstChild, "name"); + if (pName) + { + pNameList = g_list_append(pNameList, (gpointer)pName); + } + + for (lang = node->pstChild; lang; lang = lang->pstNext) + { + if (lang->enDataType == JSON_TYPE_STRING) + { + pCur = lang->unData.pcStrVal; + while (*pCur) + { + if (*pCur == '#') + { + *pCur = '\r'; + } + else if (*pCur == '@') + { + *pCur = '\n'; + } + pCur++; + } + } + } + } + + if (NULL == pNameList) + { + vlog("load_languages: no language entries found\n"); + free(pBuf); + hiso_json_destroy(json); + g_languages_json = NULL; + return 1; + } + + pNameList = g_list_sort(pNameList, lang_compare); + + for (pNameNode = g_list_first(pNameList); pNameNode; pNameNode = g_list_next(pNameNode)) + { + pName = (char *)(pNameNode->data); + pItem = (GtkRadioMenuItem *)gtk_radio_menu_item_new_with_label(pGroup, pName); + pGroup = gtk_radio_menu_item_get_group(pItem); + + if (strcmp(pCurLang, pName) == 0) + { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(pItem), TRUE); + } + + g_signal_connect(pItem, "toggled", G_CALLBACK(on_language_toggled), (gpointer)pName); + gtk_widget_show((GtkWidget *)pItem); + gtk_menu_shell_append(GTK_MENU_SHELL(g_lang_menu), (GtkWidget *)pItem); + } + + g_list_free(pNameList); + free(pBuf); + + select_language(pCurLang); + g_languages_toggled_proc = 1; + + return 0; +} + +void on_part_cfg_ok(GtkWidget *widget, gpointer data) +{ + const char *pos = NULL; + const char *input = NULL; + const char *cinput = NULL; + char device[256]; + gboolean checked = gtk_toggle_button_get_active(g_part_preserve_checkbox); + + if (checked) + { + input = gtk_entry_get_text(g_part_reserve_space_value); + if (input == NULL || input[0] == 0) + { + msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "STR_SPACE_VAL_INVALID"); + return; + } + + for (pos = input; *pos; pos++) + { + if (*pos < '0' || *pos > '9') + { + msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "STR_SPACE_VAL_INVALID"); + return; + } + } + + g_preserve_space_unit = gtk_combo_box_get_active((GtkComboBox *)g_part_space_unit_combox); + g_preserve_space_number = (int)strtol(input, NULL, 10); + + g_snprintf(device, sizeof(device), "%s [ -%d%s ]", + language_string("STR_DEVICE"), g_preserve_space_number, + g_preserve_space_unit ? "GB" : "MB"); + gtk_label_set_text(g_device_title, device); + } + else + { + gtk_label_set_text(g_device_title, language_string("STR_DEVICE")); + } + + g_preserve_space_check = checked; + g_align_part_with_4k = gtk_toggle_button_get_active(g_part_align_checkbox); + + g_fs_type = gtk_combo_box_get_active((GtkComboBox *)g_part_fs_type_combox); + + cinput = gtk_entry_get_text(g_part_cluster_size_value); + if (cinput == NULL || cinput[0] == 0) + { + g_cluster_size = 0; + } + else + { + for (pos = cinput; *pos; pos++) + { + if (*pos < '0' || *pos > '9') + { + msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "STR_SPACE_VAL_INVALID"); + return; + } + } + + g_cluster_size = (int)strtol(cinput, NULL, 10); + if (g_cluster_size <= 0) + { + msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "STR_SPACE_VAL_INVALID"); + return; + } + } + + gtk_widget_hide(g_partCfgWindow); +} + +void on_part_cfg_cancel(GtkWidget *widget, gpointer data) +{ + gtk_widget_hide(g_partCfgWindow); +} + +int on_part_cfg_close(GtkWidget *widget, gpointer data) +{ + gtk_widget_hide(g_partCfgWindow); + return TRUE; +} + +void on_part_config(GtkMenuItem *menuItem, gpointer data) +{ + char value[64]; + + gtk_toggle_button_set_active(g_part_align_checkbox, g_align_part_with_4k); + gtk_toggle_button_set_active(g_part_preserve_checkbox, g_preserve_space_check); + gtk_widget_set_sensitive(GTK_WIDGET(g_part_reserve_space_value), g_preserve_space_check); + gtk_widget_set_sensitive(GTK_WIDGET(g_part_space_unit_combox), g_preserve_space_check); + + if (g_preserve_space_check) + { + g_snprintf(value, sizeof(value), "%d", g_preserve_space_number); + gtk_entry_set_text(g_part_reserve_space_value, value); + gtk_combo_box_set_active((GtkComboBox *)g_part_space_unit_combox, g_preserve_space_unit); + } + + gtk_combo_box_set_active((GtkComboBox *)g_part_fs_type_combox, g_fs_type); + + if (g_cluster_size > 0) + { + g_snprintf(value, sizeof(value), "%d", g_cluster_size); + gtk_entry_set_text(g_part_cluster_size_value, value); + } + else + { + gtk_entry_set_text(g_part_cluster_size_value, ""); + } + + gtk_widget_show_all(g_partCfgWindow); +} + +void on_reserve_space_toggled(GtkMenuItem *menuItem, gpointer data) +{ + gboolean checked = gtk_toggle_button_get_active(g_part_preserve_checkbox); + + gtk_widget_set_sensitive(GTK_WIDGET(g_part_reserve_space_value), checked); + gtk_widget_set_sensitive(GTK_WIDGET(g_part_space_unit_combox), checked); +} + +static void init_part_cfg_window(GtkBuilder *pBuilder) +{ +#if GTK_CHECK_VERSION(3, 0, 0) + GtkWidget *pHeader = NULL; + + pHeader = gtk_header_bar_new(); + gtk_header_bar_set_show_close_button(GTK_HEADER_BAR(pHeader), FALSE); + gtk_window_set_titlebar (GTK_WINDOW(g_partCfgWindow), pHeader); + gtk_window_set_title(GTK_WINDOW(g_partCfgWindow), "Partition Configuration"); +#endif + + gtk_combo_box_set_active((GtkComboBox *)g_part_space_unit_combox, g_preserve_space_unit); + gtk_combo_box_set_active((GtkComboBox *)g_part_fs_type_combox, g_fs_type); + gtk_widget_set_sensitive (GTK_WIDGET(g_part_reserve_space_value), FALSE); + gtk_widget_set_sensitive (GTK_WIDGET(g_part_space_unit_combox), FALSE); + + SIGNAL("space_check_btn", "toggled", on_reserve_space_toggled); + + SIGNAL("button_partcfg_ok", "clicked", on_part_cfg_ok); + SIGNAL("button_partcfg_cancel", "clicked", on_part_cfg_cancel); + SIGNAL("part_cfg_dlg", "delete_event", on_part_cfg_close); +} + +static void add_accelerator(GtkAccelGroup *agMain, void *widget, const char *signal, guint accel_key) +{ + gtk_widget_add_accelerator(GTK_WIDGET(widget), signal, agMain, accel_key, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); + gtk_widget_add_accelerator(GTK_WIDGET(widget), signal, agMain, accel_key, GDK_SHIFT_MASK | GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); +} + +/* Attached screen-wide so both the main window and the part-config dialog inherit it. */ +static const char *g_premium_css = + "window {" + " background-color: #f5f5f5;" + " color: #2b2b2b;" + "}" + "frame {" + " border-radius: 6px;" + "}" + "frame > border {" + " border: 1px solid #dddddd;" + " border-radius: 6px;" + "}" + "label {" + " color: #2b2b2b;" + "}" + "progressbar trough {" + " background-color: #e2e2e2;" + " border: 1px solid #d0d0d0;" + " border-radius: 7px;" + " min-height: 18px;" + "}" + "progressbar progress {" + " background-color: #2d8e57;" + " border: none;" + " border-radius: 6px;" + "}" + "progressbar text {" + " color: #ffffff;" + " font-weight: bold;" + "}" + "button {" + " padding: 6px 16px;" + " border-radius: 4px;" + " border: 1px solid #c4c4c4;" + " background-image: linear-gradient(to bottom, #fafafa, #e9e9e9);" + " color: #2b2b2b;" + " outline: none;" + "}" + "button:hover {" + " background-image: linear-gradient(to bottom, #ffffff, #dcdcdc);" + " border-color: #a0a0a0;" + "}" + "button:active," + "button:checked {" + " background-image: linear-gradient(to bottom, #d6d6d6, #c4c4c4);" + "}" + "button.suggested-action {" + " background-image: linear-gradient(to bottom, #34a067, #2d8e57);" + " border: 1px solid #256b44;" + " color: #ffffff;" + " font-weight: bold;" + "}" + "button.suggested-action:hover {" + " background-image: linear-gradient(to bottom, #3cb578, #2f9a5d);" + " border-color: #256b44;" + "}" + "button.suggested-action:active," + "button.suggested-action:checked {" + " background-image: linear-gradient(to bottom, #2d8e57, #256b44);" + "}" + "entry {" + " border-radius: 4px;" + " border: 1px solid #c4c4c4;" + " padding: 4px 6px;" + " background-color: #ffffff;" + "}" + "entry:focus {" + " border-color: #2d8e57;" + "}" + "combobox entry," + "combobox button {" + " border-radius: 4px;" + "}" + "checkbutton {" + " padding: 2px 4px;" + " spacing: 6px;" + "}" + "checkbutton check {" + " border-radius: 3px;" + " border: 2px solid #c4c4c4;" + " background-color: #ffffff;" + " min-width: 14px;" + " min-height: 14px;" + "}" + "checkbutton check:checked {" + " border-color: #2d8e57;" + " background-color: #2d8e57;" + "}" + "menubar {" + " background-color: #ffffff;" + " border-bottom: 1px solid #dddddd;" + " padding: 2px;" + "}" + "menuitem {" + " padding: 5px 12px;" + "}" + "menuitem:hover," + "menuitem:focus {" + " background-color: #2d8e57;" + " color: #ffffff;" + "}" + "menu {" + " background-color: #ffffff;" + " border: 1px solid #dddddd;" + " border-radius: 4px;" + " padding: 4px;" + "}" + "separator {" + " background-color: #e2e2e2;" + " min-height: 1px;" + "}" + "dialog {" + " background-color: #f5f5f5;" + "}"; + +static void apply_premium_theme(void) +{ + GtkCssProvider *pProvider = NULL; + GdkScreen *pScreen = NULL; + GError *pErr = NULL; + + pProvider = gtk_css_provider_new(); + if (!gtk_css_provider_load_from_data(pProvider, g_premium_css, -1, &pErr)) + { + vlog("apply_premium_theme: failed to load CSS: %s\n", pErr ? pErr->message : "(null)"); + if (pErr) + { + g_error_free(pErr); + } + g_object_unref(pProvider); + return; + } + + pScreen = gdk_screen_get_default(); + gtk_style_context_add_provider_for_screen(pScreen, + GTK_STYLE_PROVIDER(pProvider), + GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); +} + +void on_init_window(GtkBuilder *pBuilder) +{ + GSList *pGroup = NULL; + GtkAccelGroup *agMain = NULL; + char version[512]; + + vlog("on_init_window ...\n"); + + g_pXmlBuilder = pBuilder; + g_topWindow = BUILDER_ITEM(GtkWidget, "window"); + g_partCfgWindow = BUILDER_ITEM(GtkWidget, "part_cfg_dlg"); + + apply_premium_theme(); + + g_dev_combobox = BUILDER_ITEM(GtkComboBoxText, "combobox_devlist"); + g_refresh_button = BUILDER_ITEM(GtkButton, "button_refresh"); + g_install_button = BUILDER_ITEM(GtkButton, "button_install"); + g_update_button = BUILDER_ITEM(GtkButton, "button_update"); + + gtk_style_context_add_class(gtk_widget_get_style_context(GTK_WIDGET(g_install_button)), "suggested-action"); + gtk_style_context_add_class(gtk_widget_get_style_context(GTK_WIDGET(g_update_button)), "suggested-action"); + + g_lang_menu = BUILDER_ITEM(GtkMenu, "submenu_language"); + g_menu_item_secure_boot = BUILDER_ITEM(GtkCheckMenuItem, "menu_item_secure"); + g_menu_item_mbr = BUILDER_ITEM(GtkCheckMenuItem, "menu_item_mbr"); + g_menu_item_gpt = BUILDER_ITEM(GtkCheckMenuItem, "menu_item_gpt"); + g_menu_item_show_all = BUILDER_ITEM(GtkCheckMenuItem, "menu_item_show_all"); + + g_device_title = BUILDER_ITEM(GtkLabel, "label_device"); + g_label_local_part_style = BUILDER_ITEM(GtkLabel, "label_local_part_style"); + g_label_dev_part_style = BUILDER_ITEM(GtkLabel, "label_dev_part_style"); + + g_label_local_ver = BUILDER_ITEM(GtkLabel, "label_local_ver_value"); + g_label_disk_ver = BUILDER_ITEM(GtkLabel, "label_dev_ver_value"); + + g_label_status = BUILDER_ITEM(GtkLabel, "label_status"); + + g_image_secure_local = BUILDER_ITEM(GtkImage, "image_secure_local"); + g_image_secure_device = BUILDER_ITEM(GtkImage, "image_secure_dev"); + + g_part_preserve_checkbox = BUILDER_ITEM(GtkToggleButton, "space_check_btn"); + g_part_align_checkbox = BUILDER_ITEM(GtkToggleButton, "space_align_btn"); + + g_part_reserve_space_value = BUILDER_ITEM(GtkEntry, "entry_reserve_space"); + g_part_space_unit_combox = BUILDER_ITEM(GtkComboBoxText, "comboboxtext_unit"); + g_part_fs_type_combox = BUILDER_ITEM(GtkComboBoxText, "comboboxtext_fs_type"); + g_part_cluster_size_value = BUILDER_ITEM(GtkEntry, "entry_cluster_size"); + + g_progress_bar = BUILDER_ITEM(GtkProgressBar, "progressbar1"); + + init_part_cfg_window(pBuilder); + + /* for gtk2 */ + gtk_frame_set_shadow_type(BUILDER_ITEM(GtkFrame, "frame_dummy1"), GTK_SHADOW_NONE); + gtk_frame_set_shadow_type(BUILDER_ITEM(GtkFrame, "frame_dummy2"), GTK_SHADOW_NONE); + + /* join group */ + pGroup = gtk_radio_menu_item_get_group((GtkRadioMenuItem *)g_menu_item_mbr); + gtk_radio_menu_item_set_group((GtkRadioMenuItem *)g_menu_item_gpt, pGroup); + + gtk_widget_hide((GtkWidget *)g_image_secure_local); + gtk_widget_hide((GtkWidget *)g_image_secure_device); + + g_snprintf(version, sizeof(version), HISO_VER_FMT, hiperiso_get_local_version()); + gtk_label_set_markup(g_label_local_ver, version); + + init_part_style_menu(); + gtk_check_menu_item_set_active(g_menu_item_show_all, hiperiso_code_get_cur_show_all()); + + load_languages(); + + SIGNAL("combobox_devlist", "changed", on_devlist_changed); + + SIGNAL("button_refresh", "clicked", on_button_refresh_clicked); + SIGNAL("button_install", "clicked", on_button_install_clicked); + SIGNAL("button_update", "clicked", on_button_update_clicked); + + SIGNAL("menu_item_secure", "toggled", on_secure_boot_toggled); + SIGNAL("menu_item_mbr", "toggled", on_part_style_toggled); + SIGNAL("menu_item_show_all", "toggled", on_show_all_toggled); + + SIGNAL("menu_item_part_cfg", "activate", on_part_config); + SIGNAL("menu_item_clear", "activate", on_clear_hiperiso); + SIGNAL("menu_item_part_resize", "activate", on_menu_part_resize); + SIGNAL("menu_item_about", "activate", on_about); + + agMain = gtk_accel_group_new(); + gtk_window_add_accel_group(GTK_WINDOW(g_topWindow), agMain); + add_accelerator(agMain, g_dev_combobox, "popup", GDK_KEY_d); + add_accelerator(agMain, g_install_button, "clicked", GDK_KEY_i); + add_accelerator(agMain, g_update_button, "clicked", GDK_KEY_u); + add_accelerator(agMain, g_refresh_button, "clicked", GDK_KEY_r); + + gtk_check_menu_item_set_active(g_menu_item_secure_boot, 1 - g_secure_boot_support); + + fill_dev_list(NULL); + + return; +} + +int on_exit_window(GtkWidget *widget, gpointer data) +{ + vlog("on_exit_window ...\n"); + + if (g_thread_run || hiperiso_code_is_busy()) + { + msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "STR_WAIT_PROCESS"); + return TRUE; + } + + hiperiso_code_save_cfg(); + return FALSE; +} diff --git a/src/gui/GTK/hiperiso_gtk.h b/src/gui/GTK/hiperiso_gtk.h new file mode 100644 index 0000000..07eef91 --- /dev/null +++ b/src/gui/GTK/hiperiso_gtk.h @@ -0,0 +1,70 @@ +/****************************************************************************** + * hiperiso_gtk.h + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#ifndef __HIPERISO_GTK_H__ +#define __HIPERISO_GTK_H__ + +int hiperiso_disk_init(void); +void hiperiso_disk_exit(void); +int hiperiso_http_init(void); +void hiperiso_http_exit(void); +int hiperiso_log_init(void); +void hiperiso_log_exit(void); +void *get_refresh_icon_raw_data(int *len); +void *get_secure_icon_raw_data(int *len); +void *get_window_icon_raw_data(int *len); +int hiperiso_func_handler(const char *jsonstr, char *jsonbuf, int buflen); +const char * hiperiso_code_get_cur_language(void); +int hiperiso_code_get_cur_part_style(void); +void hiperiso_code_set_cur_part_style(int style); +int hiperiso_code_get_cur_show_all(void); +void hiperiso_code_set_cur_show_all(int show_all); +void hiperiso_code_set_cur_language(const char *lang); +void hiperiso_code_save_cfg(void); +void on_init_window(GtkBuilder *pBuilder); +int on_exit_window(GtkWidget *widget, gpointer data) ; +void hiperiso_code_refresh_device(void); +int hiperiso_code_is_busy(void); +int hiperiso_code_get_percent(void); +int hiperiso_code_get_result(void); +int msgbox(GtkMessageType type, GtkButtonsType buttons, const char *strid); + +#define HISO_VER_FMT "%s" + +#define LANG_LABEL_TEXT(id, str) \ + gtk_label_set_text(BUILDER_ITEM(GtkLabel, id), hiso_json_get_string_ex(node->pstChild, str)) + +#define LANG_BUTTON_TEXT(id, str) \ + gtk_button_set_label(BUILDER_ITEM(GtkButton, id), hiso_json_get_string_ex(node->pstChild, str)) + +#define LANG_MENU_ITEM_TEXT(id, str) \ + gtk_menu_item_set_label(BUILDER_ITEM(GtkMenuItem, id), hiso_json_get_string_ex(node->pstChild, str)) + +#define LANG_CHKBTN_TEXT(id, str) \ + gtk_check_button_set_label(BUILDER_ITEM(GtkCheckButton, id), hiso_json_get_string_ex(node->pstChild, str)) + +#define BUILDER_ITEM(type, id) (type *)gtk_builder_get_object(g_pXmlBuilder, id) + +#define SIGNAL(id, act, func) \ + g_signal_connect(gtk_builder_get_object(g_pXmlBuilder, id), act, G_CALLBACK(func), NULL) + +#define GTK_MSG_ITERATION() while (gtk_events_pending ()) gtk_main_iteration() + +#endif /* __HIPERISO_GTK_H__ */ + diff --git a/src/gui/GTK/refresh_icon_data.c b/src/gui/GTK/refresh_icon_data.c new file mode 100644 index 0000000..838371d --- /dev/null +++ b/src/gui/GTK/refresh_icon_data.c @@ -0,0 +1,300 @@ +/****************************************************************************** + * refresh_icon_data.c + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + +#include +#include + +static unsigned char refresh_icon_hexData[4286] = { + 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x20, 0x20, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0xA8, 0x10, + 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x27, + 0x00, 0x00, 0x10, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, + 0x32, 0x2D, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, + 0x32, 0x81, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x2D, 0xA6, 0xBE, + 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0xBF, 0xA6, 0xBE, + 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, + 0x32, 0xBF, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x10, 0xA6, 0xBE, + 0x32, 0x71, 0xA6, 0xBE, 0x32, 0xD9, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xDA, 0xA6, 0xBE, 0x32, 0x71, 0xA6, 0xBE, + 0x32, 0x10, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, 0x32, 0xB2, 0xA6, 0xBE, + 0x32, 0xFE, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA5, 0xBD, + 0x2F, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFE, 0xA6, 0xBE, + 0x32, 0xB2, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x35, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA5, 0xBE, + 0x31, 0xFF, 0xAC, 0xC3, 0x40, 0xFF, 0xB7, 0xCA, 0x59, 0xFF, 0xBF, 0xD0, 0x6B, 0xFF, 0xC0, 0xD1, + 0x6E, 0xFF, 0xBA, 0xCD, 0x60, 0xFF, 0xAF, 0xC5, 0x48, 0xFF, 0xA7, 0xBF, 0x34, 0xFF, 0xA5, 0xBD, + 0x2F, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0x35, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x29, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xB5, 0xC9, 0x54, 0xFF, 0xD4, 0xE0, + 0x9D, 0xFF, 0xED, 0xF2, 0xD6, 0xFF, 0xF9, 0xFB, 0xF1, 0xFF, 0xFD, 0xFD, 0xFA, 0xFF, 0xFD, 0xFE, + 0xFB, 0xFF, 0xFB, 0xFC, 0xF5, 0xFF, 0xF2, 0xF6, 0xE1, 0xFF, 0xDD, 0xE6, 0xB1, 0xFF, 0xBD, 0xCF, + 0x67, 0xFF, 0xA7, 0xBF, 0x35, 0xFF, 0xA5, 0xBE, 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x10, 0xA6, 0xBE, + 0x32, 0xB2, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x31, 0xFF, 0xA8, 0xC0, 0x37, 0xFF, 0xCB, 0xD9, 0x87, 0xFF, 0xF4, 0xF7, 0xE6, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xFB, + 0xF4, 0xFF, 0xD9, 0xE4, 0xA8, 0xFF, 0xAF, 0xC4, 0x46, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xB2, 0xA6, 0xBE, + 0x32, 0x10, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x71, 0xA6, 0xBE, + 0x32, 0xFE, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA9, 0xC0, + 0x38, 0xFF, 0xD5, 0xE0, 0x9D, 0xFF, 0xFD, 0xFE, 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, + 0xFD, 0xFF, 0xEE, 0xF3, 0xD9, 0xFF, 0xD9, 0xE3, 0xA8, 0xFF, 0xCC, 0xDA, 0x8A, 0xFF, 0xCA, 0xD8, + 0x85, 0xFF, 0xD3, 0xDF, 0x99, 0xFF, 0xE6, 0xEC, 0xC4, 0xFF, 0xFA, 0xFB, 0xF3, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xED, 0xC7, 0xFF, 0xB1, 0xC6, 0x4C, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFE, 0xA6, 0xBE, + 0x32, 0x71, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0xDA, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xCD, 0xDB, + 0x8C, 0xFF, 0xFD, 0xFE, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0xF7, 0xE7, 0xFF, 0xCB, 0xD9, + 0x87, 0xFF, 0xAE, 0xC3, 0x43, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA4, 0xBD, 0x2F, 0xFF, 0xA4, 0xBD, + 0x2E, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA9, 0xC0, 0x38, 0xFF, 0xBD, 0xCF, 0x66, 0xFF, 0xE8, 0xEE, + 0xC9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0xEB, 0xC1, 0xFF, 0xAD, 0xC3, + 0x41, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xDA, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBD, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA4, 0xBC, 0x2D, 0xFF, 0xB8, 0xCB, 0x5C, 0xFF, 0xF6, 0xF9, + 0xEB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0xF5, 0xDF, 0xFF, 0xBA, 0xCD, 0x60, 0xFF, 0xA4, 0xBD, + 0x2E, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xAE, 0xC4, + 0x44, 0xFF, 0xE2, 0xE9, 0xBB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xD6, + 0x7E, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0xC0, 0xA6, 0xBE, 0x32, 0xFF, 0xA9, 0xC0, + 0x39, 0xFF, 0xC8, 0xD7, 0x80, 0xFF, 0xD0, 0xDC, 0x92, 0xFF, 0xE7, 0xEE, 0xC8, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0xED, 0xC5, 0xFF, 0xCC, 0xDA, 0x8A, 0xFF, 0xB0, 0xC5, + 0x49, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xB0, 0xC6, 0x4A, 0xFF, 0xE3, 0xEA, 0xBE, 0xFF, 0xEA, 0xEF, 0xCE, 0xFF, 0xB8, 0xCB, + 0x5C, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xBF, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x2E, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0xFF, 0xA8, 0xC0, + 0x37, 0xFF, 0xE0, 0xE8, 0xB8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xF6, 0xE3, 0xFF, 0xB3, 0xC7, + 0x4F, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xAA, 0xC1, 0x3A, 0xFF, 0xAB, 0xC1, 0x3D, 0xFF, 0xA6, 0xBE, + 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0x2D, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xB6, 0xCA, 0x58, 0xFF, 0xF4, 0xF7, 0xE6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFE, 0xFB, 0xFF, 0xC9, 0xD8, 0x84, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA5, 0xBE, 0x30, 0xFF, 0xCD, 0xDB, 0x8C, 0xFF, 0xFE, 0xFE, 0xFD, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0xEA, 0xBC, 0xFF, 0xAA, 0xC1, 0x3A, 0xFF, 0xA6, 0xBE, + 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xAB, 0xC2, 0x3E, 0xFF, 0xBB, 0xCE, 0x63, 0xFF, 0xA7, 0xBF, + 0x35, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xAB, 0xC2, 0x3E, 0xFF, 0xE6, 0xED, 0xC5, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF5, 0xF8, 0xE8, 0xFF, 0xB7, 0xCB, 0x5A, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xCE, 0xDB, 0x8F, 0xFF, 0xF7, 0xF9, 0xEC, 0xFF, 0xBD, 0xCF, + 0x67, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xBB, 0xCD, 0x63, 0xFF, 0xF6, 0xF8, + 0xEA, 0xFF, 0xCE, 0xDB, 0x8F, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xB7, 0xCB, 0x5A, 0xFF, 0xF5, 0xF8, 0xE8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0xEE, + 0xC9, 0xFF, 0xAC, 0xC2, 0x40, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA7, 0xBF, 0x34, 0xFF, 0xBA, 0xCD, + 0x60, 0xFF, 0xAB, 0xC2, 0x3E, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xAA, 0xC1, + 0x3A, 0xFF, 0xE2, 0xEA, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFE, 0xFF, 0xCF, 0xDC, 0x90, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, + 0x2F, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xC9, 0xD8, + 0x84, 0xFF, 0xFD, 0xFE, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF5, 0xF8, 0xE9, 0xFF, 0xB8, 0xCB, 0x5B, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x2E, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA9, 0xC0, + 0x38, 0xFF, 0xA8, 0xBF, 0x37, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xB2, 0xC7, 0x4F, 0xFF, 0xF2, 0xF6, + 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0xE9, 0xBB, 0xFF, 0xA9, 0xC0, 0x38, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0x2D, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0xC0, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xB5, 0xC9, 0x54, 0xFF, 0xE4, 0xEB, + 0xC1, 0xFF, 0xDF, 0xE8, 0xB5, 0xFF, 0xAF, 0xC5, 0x47, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xAF, 0xC5, 0x47, 0xFF, 0xCA, 0xD8, + 0x85, 0xFF, 0xE2, 0xE9, 0xBB, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0xEF, + 0xCD, 0xFF, 0xCE, 0xDB, 0x8F, 0xFF, 0xC7, 0xD6, 0x7E, 0xFF, 0xA9, 0xC0, 0x39, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xBF, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBD, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x73, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xC6, 0xD6, 0x7C, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xE8, 0xB5, 0xFF, 0xAC, 0xC3, 0x40, 0xFF, 0xA5, 0xBD, + 0x2F, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA4, 0xBD, 0x2E, 0xFF, 0xB5, 0xC9, + 0x55, 0xFF, 0xED, 0xF2, 0xD6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFB, 0xF1, 0xFF, 0xBC, 0xCE, + 0x65, 0xFF, 0xA4, 0xBC, 0x2C, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0xDA, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xAE, 0xC4, 0x44, 0xFF, 0xE6, 0xED, + 0xC6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0xEB, 0xC1, 0xFF, 0xB9, 0xCC, + 0x5E, 0xFF, 0xA7, 0xBF, 0x35, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA4, 0xBD, 0x2E, 0xFF, 0xA4, 0xBD, + 0x2E, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xAB, 0xC1, 0x3D, 0xFF, 0xC5, 0xD5, 0x79, 0xFF, 0xF1, 0xF5, + 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xD3, 0xDF, 0x99, 0xFF, 0xA7, 0xBE, + 0x33, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xDA, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, + 0x32, 0xFE, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xB3, 0xC8, + 0x51, 0xFF, 0xE9, 0xEF, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFA, + 0xEE, 0xFF, 0xE1, 0xE9, 0xBA, 0xFF, 0xCD, 0xDB, 0x8C, 0xFF, 0xC4, 0xD4, 0x78, 0xFF, 0xC6, 0xD6, + 0x7C, 0xFF, 0xD3, 0xDF, 0x9A, 0xFF, 0xE9, 0xEF, 0xCD, 0xFF, 0xFC, 0xFD, 0xF9, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xDB, 0xE4, 0xAB, 0xFF, 0xAA, 0xC1, 0x3C, 0xFF, 0xA6, 0xBE, + 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFE, 0xA6, 0xBE, + 0x32, 0x71, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x10, 0xA6, 0xBE, + 0x32, 0xB3, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xB1, 0xC6, 0x4B, 0xFF, 0xDD, 0xE6, 0xB2, 0xFF, 0xFC, 0xFD, 0xF8, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, + 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFA, + 0xEE, 0xFF, 0xD1, 0xDE, 0x96, 0xFF, 0xAA, 0xC1, 0x3C, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xB2, 0xA6, 0xBE, + 0x32, 0x10, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x29, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA9, 0xC0, 0x38, 0xFF, 0xC1, 0xD2, 0x71, 0xFF, 0xE2, 0xEA, + 0xBC, 0xFF, 0xF5, 0xF8, 0xE9, 0xFF, 0xFD, 0xFD, 0xFA, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, + 0xFE, 0xFF, 0xFB, 0xFC, 0xF7, 0xFF, 0xF2, 0xF5, 0xE1, 0xFF, 0xDB, 0xE5, 0xAC, 0xFF, 0xB9, 0xCC, + 0x5F, 0xFF, 0xA6, 0xBE, 0x33, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x35, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA8, 0xBF, + 0x36, 0xFF, 0xB3, 0xC7, 0x4F, 0xFF, 0xBF, 0xD0, 0x6B, 0xFF, 0xC5, 0xD5, 0x7A, 0xFF, 0xC4, 0xD4, + 0x78, 0xFF, 0xBC, 0xCE, 0x64, 0xFF, 0xB0, 0xC5, 0x48, 0xFF, 0xA6, 0xBE, 0x33, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0x35, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, 0x32, 0xB2, 0xA6, 0xBE, + 0x32, 0xFE, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA4, 0xBD, 0x2E, 0xFF, 0xA4, 0xBD, + 0x2E, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFE, 0xA6, 0xBE, + 0x32, 0xB3, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x10, 0xA6, 0xBE, + 0x32, 0x71, 0xA6, 0xBE, 0x32, 0xDA, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xDA, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, + 0x32, 0x10, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0xBF, 0xA6, 0xBE, + 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, + 0x32, 0xC0, 0xA6, 0xBE, 0x32, 0x73, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, + 0x32, 0x2D, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, + 0x32, 0x81, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x2E, 0xA6, 0xBE, + 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBD, 0x31, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, + 0x01, 0xFF, 0xFE, 0x00, 0x00, 0x7F, 0xF8, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x0F, 0xE0, 0x00, + 0x00, 0x07, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, + 0x00, 0x01, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x07, 0xF0, 0x00, + 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0xFF +}; + +void *get_refresh_icon_raw_data(int *len) +{ + *len = (int)sizeof(refresh_icon_hexData); + return refresh_icon_hexData; +} + diff --git a/src/gui/GTK/secure_icon_data.c b/src/gui/GTK/secure_icon_data.c new file mode 100644 index 0000000..b3f8b7e --- /dev/null +++ b/src/gui/GTK/secure_icon_data.c @@ -0,0 +1,91 @@ +/****************************************************************************** + * secure_icon_data.c + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + +#include +#include + +static unsigned char secure_icon_hexData[958] = { + 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xA8, 0x03, + 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x03, 0x00, 0x00, 0x46, 0x5C, + 0x00, 0x00, 0x46, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, + 0xFB, 0x01, 0x00, 0x8C, 0xFB, 0x2E, 0x00, 0x8C, 0xFB, 0x52, 0x00, 0x8C, 0xFB, 0x53, 0x00, 0x8C, + 0xFB, 0x53, 0x00, 0x8C, 0xFB, 0x53, 0x00, 0x8C, 0xFB, 0x53, 0x00, 0x8C, 0xFB, 0x53, 0x00, 0x8C, + 0xFB, 0x53, 0x00, 0x8C, 0xFB, 0x53, 0x00, 0x8C, 0xFB, 0x52, 0x00, 0x8C, 0xFB, 0x2E, 0x00, 0x8C, + 0xFB, 0x01, 0x00, 0x8C, 0xFB, 0x3E, 0x00, 0x8C, 0xFB, 0xDA, 0x00, 0x8C, 0xFB, 0xF8, 0x00, 0x8C, + 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF7, 0x00, 0x8C, + 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF8, 0x00, 0x8C, + 0xFB, 0xDA, 0x00, 0x8C, 0xFB, 0x3E, 0x00, 0x8C, 0xFB, 0x78, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0x78, 0x00, 0x8C, 0xFB, 0x7B, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0x7B, 0x00, 0x8C, + 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x86, 0xF1, 0xFF, 0x00, 0x7C, 0xDF, 0xFF, 0x00, 0x86, 0xF1, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFC, 0xFF, 0x00, 0x7C, 0xDF, 0xFF, 0x00, 0x6C, 0xC4, 0xFF, 0x00, 0x7C, + 0xDF, 0xFF, 0x00, 0x8C, 0xFC, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x87, 0xF2, 0xFF, 0x00, 0x7D, + 0xE1, 0xFF, 0x00, 0x87, 0xF2, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0x7B, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFC, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0x7B, 0x00, 0x8C, + 0xFB, 0x77, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0x77, 0x00, 0x8C, 0xFB, 0x3A, 0x00, 0x8C, 0xFB, 0xD4, 0x01, 0x8B, 0xF9, 0xF7, 0x03, 0x89, + 0xF3, 0xFF, 0x01, 0x8B, 0xF8, 0xF8, 0x00, 0x8C, 0xFB, 0xF4, 0x00, 0x8C, 0xFB, 0xF4, 0x00, 0x8C, + 0xFB, 0xF4, 0x01, 0x8B, 0xF8, 0xF8, 0x03, 0x89, 0xF3, 0xFF, 0x01, 0x8B, 0xF9, 0xF7, 0x00, 0x8C, + 0xFB, 0xD4, 0x00, 0x8C, 0xFB, 0x3A, 0x00, 0x8C, 0xFB, 0x00, 0x00, 0x93, 0xFF, 0x1E, 0x1D, 0x6B, + 0xA9, 0x6B, 0x32, 0x54, 0x6F, 0xF6, 0x22, 0x65, 0x9A, 0x7D, 0x00, 0x90, 0xFF, 0x39, 0x00, 0x8C, + 0xFB, 0x3C, 0x00, 0x90, 0xFF, 0x39, 0x22, 0x65, 0x9A, 0x7D, 0x32, 0x54, 0x6F, 0xF6, 0x1D, 0x6B, + 0xA9, 0x6B, 0x00, 0x93, 0xFF, 0x1E, 0x00, 0x8C, 0xFB, 0x00, 0x00, 0x8C, 0xFB, 0x00, 0x2A, 0x5D, + 0x85, 0x00, 0x46, 0x3D, 0x36, 0x3A, 0x43, 0x41, 0x3F, 0xF3, 0x45, 0x3F, 0x3A, 0x58, 0x26, 0x62, + 0x91, 0x00, 0x00, 0x8D, 0xFD, 0x00, 0x26, 0x62, 0x91, 0x00, 0x45, 0x3F, 0x3A, 0x58, 0x43, 0x41, + 0x3F, 0xF3, 0x46, 0x3D, 0x36, 0x3A, 0x2A, 0x5D, 0x85, 0x00, 0x00, 0x8C, 0xFB, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x27, 0x42, 0x42, 0x42, 0xE9, 0x42, 0x42, + 0x42, 0x94, 0x42, 0x42, 0x42, 0x01, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x01, 0x42, 0x42, + 0x42, 0x94, 0x42, 0x42, 0x42, 0xE9, 0x42, 0x42, 0x42, 0x27, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x04, 0x42, 0x42, + 0x42, 0x96, 0x42, 0x42, 0x42, 0xF5, 0x42, 0x42, 0x42, 0x8E, 0x42, 0x42, 0x42, 0x53, 0x42, 0x42, + 0x42, 0x8E, 0x42, 0x42, 0x42, 0xF5, 0x42, 0x42, 0x42, 0x96, 0x42, 0x42, 0x42, 0x04, 0x42, 0x42, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, + 0x42, 0x00, 0x42, 0x42, 0x42, 0x16, 0x42, 0x42, 0x42, 0x96, 0x42, 0x42, 0x42, 0xE9, 0x42, 0x42, + 0x42, 0xF3, 0x42, 0x42, 0x42, 0xE9, 0x42, 0x42, 0x42, 0x96, 0x42, 0x42, 0x42, 0x16, 0x42, 0x42, + 0x42, 0x00, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, + 0x42, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x05, 0x42, 0x42, + 0x42, 0x31, 0x42, 0x42, 0x42, 0x4B, 0x42, 0x42, 0x42, 0x31, 0x42, 0x42, 0x42, 0x05, 0x42, 0x42, + 0x42, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, + 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00 +}; + +void *get_secure_icon_raw_data(int *len) +{ + *len = (int)sizeof(secure_icon_hexData); + return secure_icon_hexData; +} diff --git a/src/gui/GTK/window_icon_data.c b/src/gui/GTK/window_icon_data.c new file mode 100644 index 0000000..17b6ac8 --- /dev/null +++ b/src/gui/GTK/window_icon_data.c @@ -0,0 +1,7633 @@ +/****************************************************************************** + * window_icon_data.c + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + +#include +#include + +static unsigned char window_icon_hexData[] = +{ + 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x68, 0x05, + 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x28, 0x08, + 0x01, 0x00, 0xCE, 0x05, 0x00, 0x00, 0x48, 0x48, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x88, 0x54, + 0x00, 0x00, 0xF6, 0x0D, 0x01, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x28, 0x42, + 0x00, 0x00, 0x7E, 0x62, 0x01, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xA8, 0x25, + 0x00, 0x00, 0xA6, 0xA4, 0x01, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xA8, 0x10, + 0x00, 0x00, 0x4E, 0xCA, 0x01, 0x00, 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, 0x5E, 0x0E, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x69, 0x1E, + 0x00, 0x00, 0x6A, 0x23, 0x00, 0x00, 0x6A, 0x32, 0x0B, 0x00, 0x70, 0x37, 0x0F, 0x00, 0x74, 0x3A, + 0x0D, 0x00, 0x6C, 0x37, 0x13, 0x00, 0x7C, 0x41, 0x12, 0x00, 0x7E, 0x45, 0x18, 0x00, 0x78, 0x49, + 0x2A, 0x00, 0x7D, 0x4C, 0x28, 0x00, 0x7D, 0x4F, 0x30, 0x00, 0x80, 0x40, 0x05, 0x00, 0x81, 0x42, + 0x09, 0x00, 0x82, 0x44, 0x0B, 0x00, 0x86, 0x46, 0x0A, 0x00, 0x82, 0x44, 0x0C, 0x00, 0x84, 0x44, + 0x0E, 0x00, 0x88, 0x48, 0x0C, 0x00, 0x8C, 0x4E, 0x0E, 0x00, 0x90, 0x4F, 0x0E, 0x00, 0x84, 0x47, + 0x10, 0x00, 0x85, 0x49, 0x12, 0x00, 0x87, 0x4B, 0x14, 0x00, 0x87, 0x4C, 0x17, 0x00, 0x8A, 0x4C, + 0x13, 0x00, 0x81, 0x47, 0x18, 0x00, 0x87, 0x4D, 0x18, 0x00, 0x88, 0x4D, 0x18, 0x00, 0x84, 0x51, + 0x1F, 0x00, 0x8D, 0x53, 0x1E, 0x00, 0x94, 0x53, 0x13, 0x00, 0x96, 0x56, 0x13, 0x00, 0x91, 0x52, + 0x14, 0x00, 0x98, 0x57, 0x11, 0x00, 0x99, 0x58, 0x13, 0x00, 0x94, 0x5A, 0x1A, 0x00, 0xA1, 0x61, + 0x17, 0x00, 0xA1, 0x62, 0x1A, 0x00, 0xA4, 0x66, 0x1D, 0x00, 0x85, 0x4E, 0x21, 0x00, 0x81, 0x4F, + 0x2B, 0x00, 0x86, 0x50, 0x23, 0x00, 0x85, 0x53, 0x27, 0x00, 0x88, 0x51, 0x21, 0x00, 0x8A, 0x54, + 0x26, 0x00, 0x87, 0x54, 0x2B, 0x00, 0x89, 0x55, 0x2A, 0x00, 0x89, 0x56, 0x2C, 0x00, 0x80, 0x54, + 0x30, 0x00, 0x82, 0x55, 0x36, 0x00, 0x8D, 0x5B, 0x32, 0x00, 0x8A, 0x5A, 0x36, 0x00, 0x89, 0x5B, + 0x3A, 0x00, 0x91, 0x5D, 0x31, 0x00, 0x99, 0x60, 0x2B, 0x00, 0x8D, 0x62, 0x33, 0x00, 0x97, 0x63, + 0x37, 0x00, 0x98, 0x62, 0x30, 0x00, 0x9D, 0x69, 0x32, 0x00, 0x9E, 0x6D, 0x31, 0x00, 0x9A, 0x67, + 0x3A, 0x00, 0xA4, 0x69, 0x28, 0x00, 0xA9, 0x6C, 0x28, 0x00, 0xB1, 0x76, 0x2D, 0x00, 0xA7, 0x6D, + 0x34, 0x00, 0xA5, 0x72, 0x3E, 0x00, 0xB2, 0x78, 0x34, 0x00, 0xD1, 0x55, 0x00, 0x00, 0x94, 0x68, + 0x45, 0x00, 0x9D, 0x6F, 0x48, 0x00, 0x9E, 0x73, 0x4F, 0x00, 0x99, 0x79, 0x50, 0x00, 0xA2, 0x74, + 0x4B, 0x00, 0xA2, 0x76, 0x51, 0x00, 0x9B, 0x7F, 0x64, 0x00, 0xBA, 0x81, 0x3B, 0x00, 0xBF, 0x86, + 0x3B, 0x00, 0xBF, 0x87, 0x3D, 0x00, 0xE6, 0xA6, 0x3E, 0x00, 0xBB, 0x87, 0x4E, 0x00, 0xBB, 0x8B, + 0x49, 0x00, 0xAB, 0x84, 0x50, 0x00, 0xAA, 0x81, 0x5C, 0x00, 0xAD, 0x83, 0x5D, 0x00, 0xB8, 0x91, + 0x62, 0x00, 0xA8, 0x93, 0x73, 0x00, 0xB9, 0x96, 0x79, 0x00, 0xC2, 0x8D, 0x47, 0x00, 0xC2, 0x8F, + 0x4D, 0x00, 0xC9, 0x93, 0x4E, 0x00, 0xCC, 0x97, 0x4D, 0x00, 0xCE, 0x99, 0x50, 0x00, 0xC8, 0x9B, + 0x5F, 0x00, 0xCC, 0x9C, 0x64, 0x00, 0xC5, 0x9B, 0x6A, 0x00, 0xC1, 0x99, 0x6F, 0x00, 0xC7, 0xA4, + 0x6F, 0x00, 0xD2, 0xA2, 0x63, 0x00, 0xD9, 0xA7, 0x64, 0x00, 0xD9, 0xAA, 0x63, 0x00, 0xDC, 0xAC, + 0x65, 0x00, 0xD6, 0xAA, 0x6E, 0x00, 0xDA, 0xAD, 0x74, 0x00, 0xD9, 0xB0, 0x78, 0x00, 0xDC, 0xB2, + 0x7D, 0x00, 0xE6, 0xB9, 0x75, 0x00, 0xEA, 0xBB, 0x76, 0x00, 0xE0, 0xB7, 0x7C, 0x00, 0xE5, 0xBA, + 0x7E, 0x00, 0xEC, 0xBF, 0x78, 0x00, 0xE8, 0xBE, 0x7C, 0x00, 0xB6, 0x99, 0x85, 0x00, 0xB1, 0xA3, + 0x90, 0x00, 0xB7, 0xAB, 0x94, 0x00, 0xBB, 0xB1, 0xA3, 0x00, 0xC2, 0xA7, 0x83, 0x00, 0xC1, 0xA3, + 0x89, 0x00, 0xD3, 0xAD, 0x80, 0x00, 0xD9, 0xB5, 0x82, 0x00, 0xCB, 0xB0, 0x97, 0x00, 0xD5, 0xB6, + 0x95, 0x00, 0xDD, 0xBF, 0x99, 0x00, 0xE4, 0xBE, 0x8B, 0x00, 0xC9, 0xBE, 0xAB, 0x00, 0xC8, 0xBF, + 0xAE, 0x00, 0xD3, 0xBC, 0xA4, 0x00, 0xC5, 0xBF, 0xB4, 0x00, 0xE7, 0xC2, 0x87, 0x00, 0xE5, 0xC1, + 0x8B, 0x00, 0xE6, 0xC3, 0x8F, 0x00, 0xEF, 0xC8, 0x89, 0x00, 0xF0, 0xCB, 0x8B, 0x00, 0xF5, 0xCE, + 0x8C, 0x00, 0xE6, 0xC4, 0x91, 0x00, 0xE7, 0xC4, 0x95, 0x00, 0xEC, 0xC7, 0x90, 0x00, 0xEA, 0xC8, + 0x93, 0x00, 0xE6, 0xC9, 0x9D, 0x00, 0xEB, 0xCB, 0x99, 0x00, 0xEF, 0xCD, 0x99, 0x00, 0xEE, 0xCF, + 0x9C, 0x00, 0xF0, 0xCB, 0x91, 0x00, 0xF2, 0xD1, 0x99, 0x00, 0xF5, 0xD3, 0x98, 0x00, 0xF5, 0xD4, + 0x9A, 0x00, 0xF5, 0xD4, 0x9D, 0x00, 0xD5, 0xC4, 0xAD, 0x00, 0xDF, 0xC7, 0xA9, 0x00, 0xDE, 0xCB, + 0xA9, 0x00, 0xC8, 0xC0, 0xB3, 0x00, 0xC9, 0xC4, 0xB9, 0x00, 0xD0, 0xC5, 0xBC, 0x00, 0xE8, 0xCA, + 0xA1, 0x00, 0xE7, 0xD1, 0xAE, 0x00, 0xEE, 0xD6, 0xAE, 0x00, 0xF5, 0xD6, 0xA0, 0x00, 0xF0, 0xD3, + 0xA5, 0x00, 0xF0, 0xD4, 0xA6, 0x00, 0xF7, 0xD8, 0xA0, 0x00, 0xF9, 0xDB, 0xA7, 0x00, 0xF4, 0xD9, + 0xA9, 0x00, 0xF9, 0xDE, 0xAD, 0x00, 0xF1, 0xD8, 0xB0, 0x00, 0xF5, 0xDB, 0xB0, 0x00, 0xF6, 0xDF, + 0xB6, 0x00, 0xF4, 0xDF, 0xB9, 0x00, 0xF0, 0xDE, 0xBF, 0x00, 0xFB, 0xE1, 0xB3, 0x00, 0xF9, 0xE1, + 0xB6, 0x00, 0xF6, 0xE0, 0xB8, 0x00, 0xF6, 0xE1, 0xBE, 0x00, 0xFC, 0xE5, 0xBC, 0x00, 0xD2, 0xCD, + 0xC2, 0x00, 0xD6, 0xD3, 0xCD, 0x00, 0xD8, 0xD5, 0xCF, 0x00, 0xD7, 0xD6, 0xD5, 0x00, 0xD8, 0xD6, + 0xD2, 0x00, 0xDF, 0xDA, 0xD1, 0x00, 0xDE, 0xDB, 0xD4, 0x00, 0xDF, 0xDD, 0xD8, 0x00, 0xE0, 0xD4, + 0xC1, 0x00, 0xE0, 0xD8, 0xCE, 0x00, 0xE1, 0xDE, 0xDA, 0x00, 0xFA, 0xE5, 0xC1, 0x00, 0xFB, 0xE7, + 0xC4, 0x00, 0xF1, 0xE4, 0xCE, 0x00, 0xE1, 0xE0, 0xDE, 0x00, 0xEF, 0xE7, 0xDA, 0x00, 0xF1, 0xE8, + 0xD8, 0x00, 0xE6, 0xE6, 0xE6, 0x00, 0xE8, 0xE9, 0xE9, 0x00, 0xEE, 0xEE, 0xEC, 0x00, 0xFB, 0xF2, + 0xE1, 0x00, 0xF0, 0xF0, 0xEE, 0x00, 0xEF, 0xF0, 0xF0, 0x00, 0xF2, 0xF1, 0xF0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x13, 0x13, + 0x13, 0x13, 0x13, 0x13, 0x0F, 0x0F, 0x0F, 0x0F, 0x13, 0x13, 0x13, 0x13, 0x13, 0x04, 0x13, 0x13, + 0x13, 0x13, 0x13, 0x1A, 0x30, 0x33, 0x33, 0x30, 0x1A, 0x13, 0x0F, 0x13, 0x13, 0x1A, 0x0F, 0x1A, + 0x13, 0x1A, 0x30, 0x0D, 0x0D, 0x0D, 0x0E, 0x35, 0x38, 0x36, 0x1E, 0x13, 0x13, 0x1A, 0x02, 0x73, + 0x4C, 0x2C, 0x09, 0x06, 0x08, 0x0A, 0x1D, 0x2B, 0x31, 0x36, 0x48, 0x49, 0x01, 0x57, 0x7B, 0x00, + 0x36, 0x09, 0x31, 0x4E, 0x30, 0x13, 0x13, 0x16, 0x1C, 0x30, 0x39, 0x4A, 0x78, 0x5A, 0x49, 0x4D, + 0x1D, 0x30, 0x9B, 0xBE, 0x74, 0x3B, 0x16, 0x17, 0x17, 0x17, 0x22, 0x3E, 0x57, 0x40, 0x05, 0x3C, + 0x13, 0x3E, 0xB4, 0xC6, 0xC1, 0x76, 0x4B, 0x27, 0x26, 0x26, 0x26, 0x22, 0x45, 0x81, 0xC4, 0x3E, + 0x22, 0x2A, 0x58, 0xBA, 0xC1, 0xBE, 0x82, 0x59, 0x3E, 0x2A, 0x2A, 0x28, 0x42, 0x62, 0x7C, 0x44, + 0x42, 0x43, 0x43, 0x77, 0xB3, 0x99, 0xB0, 0x9B, 0x75, 0x55, 0x43, 0x43, 0x46, 0x62, 0x97, 0x53, + 0x4F, 0x4F, 0x5B, 0x60, 0x96, 0xB2, 0x7F, 0xB1, 0xB4, 0x7F, 0x54, 0x4F, 0x5B, 0x79, 0x03, 0x61, + 0x5E, 0x5F, 0x69, 0x6C, 0x7A, 0xB8, 0xB4, 0xBA, 0xC3, 0xB4, 0x64, 0x5F, 0x65, 0x7D, 0x6A, 0x6C, + 0x66, 0x66, 0x84, 0x8A, 0x84, 0x8D, 0xBF, 0xC7, 0xC7, 0xC7, 0x98, 0x66, 0x6F, 0x47, 0x8A, 0x9C, + 0x70, 0x6E, 0x8E, 0xA0, 0xA0, 0xA0, 0xA8, 0xA9, 0xBD, 0xC0, 0x83, 0x72, 0x8E, 0x8C, 0x7E, 0x8A, + 0x8E, 0x87, 0x95, 0xA8, 0xAE, 0xAE, 0xA8, 0xA8, 0xAE, 0xA8, 0x88, 0x95, 0x72, 0xFF, 0x9D, 0x6E, + 0x91, 0xA0, 0x95, 0xA5, 0xBC, 0xBC, 0xBC, 0xBC, 0xAB, 0xA4, 0x95, 0x52, 0xAE, 0x9D, 0x00, 0xA8, + 0x88, 0x95, 0xAB, 0xA3, 0xAB, 0xAF, 0xAF, 0xAF, 0xA5, 0xA5, 0x95, 0xAF, 0xA8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, + 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, + 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, + 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, + 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, + 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, + 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, + 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, + 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, + 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, + 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, + 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, + 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, + 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, + 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, + 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, + 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, + 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, + 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, + 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, + 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, + 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, + 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, + 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, + 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, + 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, + 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, + 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, + 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, + 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, + 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, + 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, + 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, + 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, + 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, + 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, + 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, + 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, + 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0D, 0x83, 0x45, + 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x0F, 0x83, 0x45, + 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x11, 0x83, 0x45, + 0x0C, 0x11, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, + 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x13, 0x83, 0x45, + 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x13, 0x83, 0x45, 0x0C, 0x13, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, + 0x0C, 0x13, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, 0x0C, 0x13, 0x83, 0x45, + 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, + 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, + 0x0C, 0x11, 0x83, 0x45, 0x0C, 0x11, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, + 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x0F, 0x83, 0x45, + 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, + 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, + 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, + 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, + 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, + 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, + 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, + 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x0F, 0x83, 0x45, + 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x11, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, + 0x0C, 0x13, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, 0x0C, 0x15, 0x83, 0x45, + 0x0C, 0x17, 0x83, 0x45, 0x0C, 0x17, 0x83, 0x45, 0x0C, 0x18, 0x83, 0x45, 0x0C, 0x19, 0x83, 0x45, + 0x0C, 0x19, 0x83, 0x45, 0x0C, 0x1A, 0x82, 0x45, 0x0C, 0x1A, 0x83, 0x45, 0x0C, 0x1B, 0x82, 0x45, + 0x0C, 0x1C, 0x83, 0x45, 0x0C, 0x1C, 0x83, 0x45, 0x0C, 0x1D, 0x83, 0x45, 0x0C, 0x1D, 0x83, 0x45, + 0x0C, 0x1D, 0x83, 0x45, 0x0C, 0x1D, 0x83, 0x45, 0x0C, 0x1E, 0x83, 0x45, 0x0C, 0x1E, 0x83, 0x45, + 0x0C, 0x1E, 0x83, 0x45, 0x0C, 0x1E, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, + 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, + 0x0C, 0x1E, 0x83, 0x45, 0x0C, 0x1E, 0x83, 0x45, 0x0C, 0x1E, 0x83, 0x45, 0x0C, 0x1E, 0x83, 0x45, + 0x0C, 0x1D, 0x83, 0x45, 0x0C, 0x1C, 0x82, 0x45, 0x0C, 0x1C, 0x83, 0x45, 0x0C, 0x1C, 0x83, 0x45, + 0x0C, 0x1C, 0x83, 0x45, 0x0C, 0x1B, 0x83, 0x45, 0x0C, 0x1A, 0x83, 0x45, 0x0C, 0x1A, 0x83, 0x45, + 0x0C, 0x19, 0x83, 0x45, 0x0C, 0x18, 0x83, 0x45, 0x0C, 0x18, 0x83, 0x45, 0x0C, 0x17, 0x83, 0x45, + 0x0C, 0x17, 0x83, 0x45, 0x0C, 0x16, 0x83, 0x45, 0x0C, 0x15, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, + 0x0C, 0x13, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x11, 0x83, 0x45, + 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, + 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, + 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, + 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, + 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, + 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, + 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, + 0x0C, 0x11, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, 0x0C, 0x15, 0x83, 0x45, + 0x0C, 0x16, 0x83, 0x45, 0x0C, 0x17, 0x83, 0x45, 0x0C, 0x18, 0x83, 0x45, 0x0C, 0x19, 0x83, 0x45, + 0x0C, 0x1B, 0x83, 0x45, 0x0C, 0x1C, 0x83, 0x45, 0x0C, 0x1D, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, + 0x0C, 0x20, 0x83, 0x45, 0x0C, 0x20, 0x83, 0x45, 0x0C, 0x20, 0x83, 0x45, 0x0C, 0x21, 0x83, 0x45, + 0x0C, 0x23, 0x83, 0x45, 0x0C, 0x24, 0x83, 0x45, 0x0C, 0x24, 0x83, 0x45, 0x0C, 0x25, 0x83, 0x45, + 0x0C, 0x25, 0x83, 0x45, 0x0C, 0x26, 0x83, 0x45, 0x0C, 0x26, 0x83, 0x45, 0x0C, 0x26, 0x83, 0x45, + 0x0C, 0x27, 0x83, 0x45, 0x0C, 0x27, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, + 0x0C, 0x29, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, 0x0C, 0x2A, 0x83, 0x45, + 0x0C, 0x29, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, 0x0C, 0x2A, 0x83, 0x45, 0x0C, 0x2A, 0x83, 0x45, + 0x0C, 0x2A, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, + 0x0C, 0x28, 0x83, 0x45, 0x0C, 0x28, 0x83, 0x45, 0x0C, 0x27, 0x83, 0x45, 0x0C, 0x27, 0x83, 0x45, + 0x0C, 0x27, 0x83, 0x45, 0x0C, 0x26, 0x83, 0x45, 0x0C, 0x25, 0x83, 0x45, 0x0C, 0x24, 0x83, 0x45, + 0x0C, 0x24, 0x83, 0x45, 0x0C, 0x23, 0x83, 0x45, 0x0C, 0x22, 0x83, 0x45, 0x0C, 0x21, 0x83, 0x45, + 0x0C, 0x21, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x1E, 0x83, 0x45, + 0x0C, 0x1D, 0x83, 0x45, 0x0C, 0x1B, 0x83, 0x45, 0x0C, 0x1A, 0x83, 0x45, 0x0C, 0x19, 0x83, 0x45, + 0x0C, 0x18, 0x83, 0x45, 0x0C, 0x17, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, 0x0C, 0x13, 0x83, 0x45, + 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x11, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x0F, 0x83, 0x45, + 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, + 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, + 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x82, 0x45, 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, + 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x82, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, + 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0D, 0x83, 0x45, + 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x11, 0x83, 0x45, 0x0C, 0x13, 0x83, 0x45, 0x0C, 0x15, 0x83, 0x45, + 0x0C, 0x17, 0x83, 0x45, 0x0C, 0x18, 0x83, 0x45, 0x0C, 0x1A, 0x83, 0x45, 0x0C, 0x1C, 0x83, 0x45, + 0x0C, 0x1E, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x20, 0x83, 0x45, 0x0C, 0x22, 0x83, 0x45, + 0x0C, 0x23, 0x83, 0x45, 0x0C, 0x25, 0x82, 0x45, 0x0C, 0x27, 0x83, 0x45, 0x0C, 0x28, 0x82, 0x45, + 0x0C, 0x29, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, 0x0C, 0x2A, 0x83, 0x45, 0x0C, 0x2B, 0x83, 0x45, + 0x0C, 0x2D, 0x83, 0x45, 0x0C, 0x2E, 0x83, 0x45, 0x0C, 0x2F, 0x83, 0x45, 0x0C, 0x2F, 0x83, 0x45, + 0x0C, 0x2F, 0x83, 0x45, 0x0C, 0x30, 0x83, 0x45, 0x0C, 0x31, 0x83, 0x45, 0x0C, 0x31, 0x83, 0x45, + 0x0C, 0x32, 0x83, 0x45, 0x0C, 0x32, 0x83, 0x45, 0x0C, 0x34, 0x83, 0x45, 0x0C, 0x34, 0x83, 0x45, + 0x0C, 0x34, 0x83, 0x45, 0x0C, 0x33, 0x83, 0x45, 0x0C, 0x34, 0x83, 0x45, 0x0C, 0x33, 0x83, 0x45, + 0x0C, 0x34, 0x83, 0x45, 0x0C, 0x33, 0x83, 0x45, 0x0C, 0x34, 0x83, 0x45, 0x0C, 0x33, 0x83, 0x45, + 0x0C, 0x34, 0x83, 0x45, 0x0C, 0x34, 0x82, 0x45, 0x0C, 0x34, 0x83, 0x45, 0x0C, 0x33, 0x82, 0x45, + 0x0C, 0x33, 0x83, 0x45, 0x0C, 0x32, 0x82, 0x45, 0x0C, 0x32, 0x83, 0x45, 0x0C, 0x31, 0x83, 0x45, + 0x0C, 0x31, 0x83, 0x45, 0x0C, 0x30, 0x83, 0x45, 0x0C, 0x2F, 0x83, 0x45, 0x0C, 0x2E, 0x83, 0x45, + 0x0C, 0x2D, 0x83, 0x45, 0x0C, 0x2D, 0x83, 0x45, 0x0C, 0x2C, 0x83, 0x45, 0x0C, 0x2B, 0x83, 0x45, + 0x0C, 0x2A, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, 0x0C, 0x28, 0x83, 0x45, 0x0C, 0x27, 0x83, 0x45, + 0x0C, 0x26, 0x83, 0x45, 0x0C, 0x24, 0x83, 0x45, 0x0C, 0x22, 0x83, 0x45, 0x0C, 0x21, 0x83, 0x45, + 0x0C, 0x20, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x1C, 0x83, 0x45, 0x0C, 0x19, 0x83, 0x45, + 0x0C, 0x18, 0x83, 0x45, 0x0C, 0x16, 0x83, 0x45, 0x0C, 0x15, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, + 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x0D, 0x83, 0x45, + 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, + 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x03, 0x82, 0x45, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x01, 0x82, 0x45, 0x0C, 0x01, 0x82, 0x45, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, + 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, + 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0D, 0x83, 0x45, + 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x11, 0x83, 0x45, 0x0C, 0x13, 0x83, 0x45, 0x0C, 0x15, 0x83, 0x45, + 0x0C, 0x18, 0x83, 0x45, 0x0C, 0x1A, 0x83, 0x45, 0x0C, 0x1C, 0x83, 0x45, 0x0C, 0x1E, 0x83, 0x45, + 0x0C, 0x21, 0x83, 0x45, 0x0C, 0x23, 0x83, 0x45, 0x0C, 0x26, 0x83, 0x45, 0x0C, 0x28, 0x83, 0x45, + 0x0C, 0x2A, 0x83, 0x45, 0x0C, 0x2C, 0x83, 0x45, 0x0C, 0x2E, 0x83, 0x45, 0x0C, 0x30, 0x83, 0x45, + 0x0C, 0x31, 0x83, 0x45, 0x0C, 0x32, 0x83, 0x45, 0x0C, 0x33, 0x83, 0x45, 0x0C, 0x35, 0x83, 0x45, + 0x0C, 0x36, 0x83, 0x45, 0x0C, 0x37, 0x83, 0x45, 0x0C, 0x39, 0x83, 0x45, 0x0C, 0x3A, 0x83, 0x45, + 0x0C, 0x3B, 0x83, 0x45, 0x0C, 0x3C, 0x83, 0x45, 0x0C, 0x3C, 0x83, 0x45, 0x0C, 0x3D, 0x83, 0x45, + 0x0C, 0x3E, 0x83, 0x45, 0x0C, 0x3F, 0x83, 0x45, 0x0C, 0x40, 0x83, 0x45, 0x0C, 0x40, 0x83, 0x45, + 0x0C, 0x41, 0x83, 0x45, 0x0C, 0x41, 0x83, 0x45, 0x0C, 0x43, 0x83, 0x45, 0x0C, 0x43, 0x83, 0x45, + 0x0C, 0x43, 0x83, 0x45, 0x0C, 0x43, 0x83, 0x45, 0x0C, 0x43, 0x83, 0x45, 0x0C, 0x43, 0x83, 0x45, + 0x0C, 0x43, 0x83, 0x45, 0x0C, 0x43, 0x83, 0x45, 0x0C, 0x43, 0x83, 0x45, 0x0C, 0x43, 0x83, 0x45, + 0x0C, 0x43, 0x83, 0x45, 0x0C, 0x43, 0x83, 0x45, 0x0C, 0x43, 0x83, 0x45, 0x0C, 0x43, 0x83, 0x45, + 0x0C, 0x42, 0x83, 0x45, 0x0C, 0x41, 0x83, 0x45, 0x0C, 0x40, 0x83, 0x45, 0x0C, 0x3F, 0x83, 0x45, + 0x0C, 0x3F, 0x83, 0x45, 0x0C, 0x3E, 0x83, 0x45, 0x0C, 0x3D, 0x83, 0x45, 0x0C, 0x3C, 0x83, 0x45, + 0x0C, 0x3B, 0x83, 0x45, 0x0C, 0x3A, 0x83, 0x45, 0x0C, 0x39, 0x83, 0x45, 0x0C, 0x38, 0x83, 0x45, + 0x0C, 0x37, 0x83, 0x45, 0x0C, 0x36, 0x83, 0x45, 0x0C, 0x34, 0x83, 0x45, 0x0C, 0x32, 0x83, 0x45, + 0x0C, 0x31, 0x83, 0x45, 0x0C, 0x30, 0x83, 0x45, 0x0C, 0x2E, 0x83, 0x45, 0x0C, 0x2D, 0x83, 0x45, + 0x0C, 0x2C, 0x83, 0x45, 0x0C, 0x2A, 0x83, 0x45, 0x0C, 0x27, 0x83, 0x45, 0x0C, 0x26, 0x83, 0x45, + 0x0C, 0x24, 0x83, 0x45, 0x0C, 0x22, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x1D, 0x83, 0x45, + 0x0C, 0x1B, 0x83, 0x45, 0x0C, 0x19, 0x83, 0x45, 0x0C, 0x16, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, + 0x0C, 0x11, 0x83, 0x45, 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, + 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x82, 0x45, 0x0C, 0x02, 0x82, 0x45, 0x0C, 0x02, 0x82, 0x44, + 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, + 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, + 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x11, 0x83, 0x45, + 0x0C, 0x15, 0x83, 0x45, 0x0C, 0x18, 0x83, 0x45, 0x0C, 0x1B, 0x83, 0x45, 0x0C, 0x1E, 0x83, 0x45, + 0x0C, 0x20, 0x83, 0x45, 0x0C, 0x23, 0x83, 0x45, 0x0C, 0x26, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, + 0x0C, 0x2C, 0x83, 0x45, 0x0C, 0x2F, 0x83, 0x45, 0x0C, 0x31, 0x83, 0x45, 0x0C, 0x33, 0x82, 0x45, + 0x0C, 0x35, 0x83, 0x45, 0x0C, 0x37, 0x82, 0x45, 0x0C, 0x39, 0x83, 0x45, 0x0C, 0x3B, 0x83, 0x45, + 0x0C, 0x3D, 0x83, 0x45, 0x0C, 0x3E, 0x83, 0x45, 0x0C, 0x40, 0x83, 0x45, 0x0C, 0x42, 0x83, 0x45, + 0x0C, 0x44, 0x83, 0x45, 0x0C, 0x45, 0x83, 0x45, 0x0C, 0x46, 0x83, 0x45, 0x0C, 0x48, 0x83, 0x45, + 0x0C, 0x49, 0x83, 0x45, 0x0C, 0x4A, 0x83, 0x45, 0x0C, 0x4B, 0x83, 0x45, 0x0C, 0x4C, 0x83, 0x45, + 0x0C, 0x4D, 0x83, 0x45, 0x0C, 0x4E, 0x82, 0x45, 0x0C, 0x4F, 0x83, 0x45, 0x0C, 0x4F, 0x82, 0x45, + 0x0C, 0x4F, 0x83, 0x45, 0x0C, 0x50, 0x82, 0x45, 0x0C, 0x51, 0x83, 0x45, 0x0C, 0x51, 0x82, 0x45, + 0x0C, 0x51, 0x82, 0x45, 0x0C, 0x51, 0x82, 0x45, 0x0C, 0x51, 0x83, 0x45, 0x0C, 0x51, 0x82, 0x45, + 0x0C, 0x52, 0x83, 0x45, 0x0C, 0x52, 0x82, 0x45, 0x0C, 0x52, 0x83, 0x45, 0x0C, 0x51, 0x82, 0x45, + 0x0C, 0x52, 0x83, 0x45, 0x0C, 0x52, 0x82, 0x45, 0x0C, 0x53, 0x83, 0x45, 0x0C, 0x52, 0x82, 0x45, + 0x0C, 0x52, 0x83, 0x45, 0x0C, 0x50, 0x82, 0x45, 0x0C, 0x50, 0x83, 0x45, 0x0C, 0x4E, 0x82, 0x45, + 0x0C, 0x4E, 0x83, 0x45, 0x0C, 0x4D, 0x82, 0x45, 0x0C, 0x4D, 0x83, 0x45, 0x0C, 0x4B, 0x82, 0x45, + 0x0C, 0x4A, 0x83, 0x45, 0x0C, 0x49, 0x82, 0x45, 0x0C, 0x48, 0x83, 0x45, 0x0C, 0x47, 0x82, 0x45, + 0x0C, 0x46, 0x83, 0x45, 0x0C, 0x45, 0x82, 0x45, 0x0C, 0x43, 0x83, 0x45, 0x0C, 0x40, 0x83, 0x45, + 0x0C, 0x3F, 0x83, 0x45, 0x0C, 0x3D, 0x83, 0x45, 0x0C, 0x3C, 0x83, 0x45, 0x0C, 0x3A, 0x83, 0x45, + 0x0C, 0x39, 0x83, 0x45, 0x0C, 0x36, 0x83, 0x45, 0x0C, 0x34, 0x83, 0x45, 0x0C, 0x31, 0x83, 0x45, + 0x0C, 0x2F, 0x83, 0x45, 0x0C, 0x2D, 0x83, 0x45, 0x0C, 0x2B, 0x83, 0x45, 0x0C, 0x27, 0x83, 0x45, + 0x0C, 0x24, 0x83, 0x45, 0x0C, 0x22, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x1B, 0x83, 0x45, + 0x0C, 0x17, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, + 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x0A, 0x82, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, + 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x03, 0x82, 0x45, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, + 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, + 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, + 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x11, 0x83, 0x45, 0x0C, 0x15, 0x83, 0x45, 0x0C, 0x19, 0x83, 0x45, + 0x0C, 0x1D, 0x83, 0x45, 0x0C, 0x21, 0x83, 0x45, 0x0C, 0x24, 0x83, 0x45, 0x0C, 0x28, 0x83, 0x45, + 0x0C, 0x2C, 0x83, 0x45, 0x0C, 0x30, 0x83, 0x45, 0x0C, 0x33, 0x83, 0x45, 0x0C, 0x37, 0x83, 0x45, + 0x0C, 0x3A, 0x83, 0x45, 0x0C, 0x3C, 0x83, 0x45, 0x0C, 0x3F, 0x83, 0x45, 0x0C, 0x42, 0x83, 0x45, + 0x0C, 0x44, 0x83, 0x45, 0x0C, 0x46, 0x83, 0x45, 0x0C, 0x49, 0x83, 0x45, 0x0C, 0x4B, 0x83, 0x45, + 0x0C, 0x4D, 0x83, 0x45, 0x0C, 0x4F, 0x83, 0x45, 0x0C, 0x51, 0x83, 0x45, 0x0C, 0x53, 0x83, 0x45, + 0x0C, 0x54, 0x83, 0x45, 0x0C, 0x55, 0x83, 0x45, 0x0D, 0x57, 0x83, 0x45, 0x0C, 0x59, 0x83, 0x45, + 0x0C, 0x59, 0x83, 0x45, 0x0C, 0x5A, 0x83, 0x45, 0x0C, 0x5C, 0x83, 0x45, 0x0C, 0x5D, 0x83, 0x45, + 0x0C, 0x5E, 0x83, 0x45, 0x0C, 0x5F, 0x82, 0x45, 0x0C, 0x5F, 0x83, 0x45, 0x0C, 0x5F, 0x82, 0x45, + 0x0C, 0x60, 0x82, 0x45, 0x0C, 0x60, 0x82, 0x45, 0x0C, 0x61, 0x82, 0x45, 0x0C, 0x61, 0x82, 0x45, + 0x0C, 0x61, 0x82, 0x44, 0x0C, 0x61, 0x82, 0x45, 0x0C, 0x61, 0x82, 0x45, 0x0C, 0x61, 0x82, 0x45, + 0x0C, 0x61, 0x82, 0x45, 0x0C, 0x62, 0x82, 0x45, 0x0C, 0x62, 0x83, 0x45, 0x0C, 0x61, 0x82, 0x45, + 0x0C, 0x61, 0x83, 0x45, 0x0C, 0x61, 0x83, 0x45, 0x0C, 0x62, 0x83, 0x45, 0x0C, 0x62, 0x83, 0x45, + 0x0C, 0x62, 0x83, 0x45, 0x0C, 0x61, 0x83, 0x45, 0x0C, 0x60, 0x83, 0x45, 0x0C, 0x5F, 0x83, 0x45, + 0x0C, 0x5E, 0x83, 0x45, 0x0C, 0x5E, 0x82, 0x45, 0x0C, 0x5D, 0x83, 0x45, 0x0C, 0x5C, 0x82, 0x45, + 0x0C, 0x5B, 0x83, 0x45, 0x0C, 0x5A, 0x82, 0x45, 0x0C, 0x59, 0x83, 0x45, 0x0C, 0x58, 0x82, 0x45, + 0x0C, 0x56, 0x83, 0x45, 0x0C, 0x54, 0x83, 0x45, 0x0C, 0x52, 0x83, 0x45, 0x0C, 0x50, 0x83, 0x45, + 0x0C, 0x4E, 0x83, 0x45, 0x0C, 0x4C, 0x83, 0x45, 0x0C, 0x4A, 0x83, 0x45, 0x0C, 0x48, 0x83, 0x45, + 0x0C, 0x46, 0x83, 0x45, 0x0C, 0x44, 0x83, 0x45, 0x0C, 0x41, 0x83, 0x45, 0x0C, 0x3F, 0x83, 0x45, + 0x0C, 0x3C, 0x83, 0x45, 0x0C, 0x39, 0x83, 0x45, 0x0C, 0x37, 0x83, 0x45, 0x0C, 0x34, 0x83, 0x45, + 0x0C, 0x2F, 0x83, 0x45, 0x0C, 0x2C, 0x83, 0x45, 0x0C, 0x2A, 0x83, 0x45, 0x0C, 0x26, 0x83, 0x45, + 0x0C, 0x21, 0x83, 0x45, 0x0C, 0x1E, 0x83, 0x45, 0x0C, 0x1A, 0x83, 0x45, 0x0C, 0x16, 0x83, 0x45, + 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, + 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x02, 0x81, 0x44, + 0x0B, 0x02, 0x81, 0x44, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, + 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, + 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, + 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x17, 0x83, 0x45, 0x0C, 0x1C, 0x83, 0x45, 0x0C, 0x21, 0x83, 0x45, + 0x0C, 0x25, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, 0x0C, 0x2E, 0x83, 0x45, 0x0C, 0x32, 0x83, 0x45, + 0x0C, 0x37, 0x83, 0x45, 0x0C, 0x3B, 0x82, 0x45, 0x0C, 0x40, 0x83, 0x45, 0x0C, 0x43, 0x82, 0x45, + 0x0C, 0x46, 0x83, 0x45, 0x0C, 0x49, 0x83, 0x45, 0x0C, 0x4D, 0x83, 0x45, 0x0C, 0x4F, 0x83, 0x45, + 0x0C, 0x52, 0x83, 0x45, 0x0C, 0x54, 0x83, 0x45, 0x0C, 0x57, 0x83, 0x45, 0x0C, 0x5A, 0x83, 0x45, + 0x0C, 0x5C, 0x83, 0x45, 0x0C, 0x5E, 0x83, 0x45, 0x0C, 0x60, 0x83, 0x45, 0x0C, 0x62, 0x83, 0x45, + 0x0C, 0x63, 0x83, 0x45, 0x0C, 0x65, 0x82, 0x45, 0x0C, 0x66, 0x83, 0x45, 0x0C, 0x67, 0x82, 0x45, + 0x0C, 0x68, 0x83, 0x45, 0x0C, 0x69, 0x82, 0x45, 0x0C, 0x6B, 0x83, 0x45, 0x0C, 0x6C, 0x82, 0x45, + 0x0C, 0x6D, 0x83, 0x45, 0x0C, 0x6E, 0x83, 0x45, 0x0C, 0x6E, 0x83, 0x45, 0x0C, 0x6F, 0x83, 0x45, + 0x0C, 0x70, 0x83, 0x45, 0x0C, 0x71, 0x82, 0x45, 0x0C, 0x72, 0x83, 0x44, 0x0C, 0x72, 0x82, 0x45, + 0x0C, 0x72, 0x83, 0x44, 0x0C, 0x72, 0x82, 0x45, 0x0C, 0x72, 0x83, 0x44, 0x0C, 0x72, 0x82, 0x45, + 0x0C, 0x73, 0x83, 0x45, 0x0C, 0x73, 0x83, 0x45, 0x0C, 0x73, 0x83, 0x45, 0x0C, 0x73, 0x83, 0x45, + 0x0C, 0x72, 0x83, 0x45, 0x0C, 0x71, 0x83, 0x45, 0x0C, 0x72, 0x83, 0x45, 0x0C, 0x71, 0x83, 0x45, + 0x0C, 0x71, 0x83, 0x45, 0x0C, 0x6F, 0x83, 0x45, 0x0C, 0x6F, 0x83, 0x45, 0x0C, 0x6E, 0x82, 0x45, + 0x0C, 0x6E, 0x83, 0x45, 0x0C, 0x6D, 0x82, 0x45, 0x0C, 0x6C, 0x83, 0x45, 0x0C, 0x6B, 0x82, 0x45, + 0x0C, 0x6A, 0x83, 0x45, 0x0C, 0x69, 0x82, 0x45, 0x0C, 0x68, 0x83, 0x45, 0x0C, 0x67, 0x82, 0x45, + 0x0C, 0x66, 0x83, 0x45, 0x0C, 0x64, 0x82, 0x45, 0x0C, 0x62, 0x83, 0x45, 0x0C, 0x60, 0x82, 0x45, + 0x0C, 0x5E, 0x83, 0x45, 0x0C, 0x5C, 0x82, 0x45, 0x0C, 0x5A, 0x83, 0x45, 0x0C, 0x57, 0x82, 0x45, + 0x0C, 0x56, 0x83, 0x45, 0x0C, 0x53, 0x83, 0x45, 0x0C, 0x51, 0x83, 0x45, 0x0C, 0x4E, 0x83, 0x45, + 0x0C, 0x4B, 0x83, 0x45, 0x0C, 0x48, 0x83, 0x45, 0x0C, 0x45, 0x83, 0x45, 0x0C, 0x41, 0x83, 0x45, + 0x0C, 0x3D, 0x83, 0x45, 0x0C, 0x38, 0x83, 0x45, 0x0C, 0x35, 0x83, 0x45, 0x0C, 0x31, 0x83, 0x45, + 0x0C, 0x2B, 0x83, 0x45, 0x0C, 0x27, 0x83, 0x45, 0x0C, 0x22, 0x83, 0x45, 0x0C, 0x1D, 0x83, 0x45, + 0x0C, 0x18, 0x83, 0x45, 0x0C, 0x13, 0x82, 0x45, 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x0D, 0x83, 0x45, + 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0B, 0x03, 0x81, 0x44, + 0x0A, 0x03, 0x82, 0x44, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x43, 0x09, 0x01, 0x82, 0x44, 0x0A, 0x01, 0x83, 0x45, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, + 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x13, 0x83, 0x45, + 0x0C, 0x18, 0x83, 0x45, 0x0C, 0x1E, 0x83, 0x45, 0x0C, 0x24, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, + 0x0C, 0x2F, 0x83, 0x45, 0x0C, 0x35, 0x83, 0x45, 0x0C, 0x3B, 0x83, 0x45, 0x0C, 0x40, 0x83, 0x45, + 0x0C, 0x46, 0x83, 0x45, 0x0C, 0x4A, 0x83, 0x45, 0x0C, 0x4F, 0x83, 0x45, 0x0C, 0x53, 0x83, 0x45, + 0x0C, 0x57, 0x83, 0x45, 0x0C, 0x5A, 0x83, 0x45, 0x0C, 0x5D, 0x83, 0x45, 0x0C, 0x60, 0x83, 0x45, + 0x0C, 0x63, 0x83, 0x45, 0x0C, 0x65, 0x83, 0x45, 0x0C, 0x68, 0x83, 0x45, 0x0C, 0x6A, 0x83, 0x45, + 0x0D, 0x6D, 0x83, 0x45, 0x0C, 0x6F, 0x83, 0x45, 0x0C, 0x71, 0x83, 0x45, 0x0C, 0x73, 0x83, 0x45, + 0x0C, 0x74, 0x83, 0x45, 0x0C, 0x76, 0x82, 0x45, 0x0C, 0x77, 0x82, 0x45, 0x0C, 0x77, 0x82, 0x45, + 0x0C, 0x78, 0x82, 0x45, 0x0C, 0x79, 0x82, 0x45, 0x0D, 0x7A, 0x82, 0x45, 0x0D, 0x7B, 0x83, 0x45, + 0x0D, 0x7D, 0x84, 0x46, 0x0D, 0x7D, 0x84, 0x46, 0x0D, 0x7E, 0x84, 0x46, 0x0C, 0x7F, 0x84, 0x46, + 0x0C, 0x81, 0x83, 0x45, 0x0C, 0x82, 0x83, 0x45, 0x0B, 0x82, 0x83, 0x45, 0x0B, 0x82, 0x83, 0x45, + 0x0B, 0x82, 0x83, 0x45, 0x0B, 0x82, 0x83, 0x45, 0x0B, 0x82, 0x83, 0x44, 0x0B, 0x83, 0x83, 0x44, + 0x0B, 0x83, 0x83, 0x44, 0x0B, 0x83, 0x83, 0x44, 0x0B, 0x83, 0x83, 0x44, 0x0B, 0x82, 0x83, 0x45, + 0x0C, 0x81, 0x84, 0x46, 0x0C, 0x81, 0x84, 0x45, 0x0C, 0x80, 0x84, 0x46, 0x0C, 0x80, 0x83, 0x46, + 0x0D, 0x7F, 0x83, 0x46, 0x0D, 0x7E, 0x83, 0x45, 0x0C, 0x7E, 0x83, 0x45, 0x0D, 0x7D, 0x83, 0x45, + 0x0C, 0x7D, 0x83, 0x45, 0x0D, 0x7C, 0x83, 0x45, 0x0C, 0x7B, 0x83, 0x45, 0x0C, 0x7A, 0x83, 0x45, + 0x0C, 0x7A, 0x83, 0x45, 0x0C, 0x79, 0x83, 0x45, 0x0C, 0x78, 0x83, 0x45, 0x0C, 0x77, 0x83, 0x45, + 0x0C, 0x75, 0x83, 0x45, 0x0C, 0x74, 0x83, 0x45, 0x0C, 0x72, 0x83, 0x45, 0x0C, 0x71, 0x82, 0x45, + 0x0C, 0x6F, 0x83, 0x45, 0x0C, 0x6D, 0x82, 0x45, 0x0C, 0x6A, 0x83, 0x45, 0x0C, 0x68, 0x83, 0x45, + 0x0C, 0x65, 0x83, 0x45, 0x0C, 0x63, 0x83, 0x45, 0x0C, 0x5F, 0x83, 0x45, 0x0C, 0x5D, 0x83, 0x45, + 0x0C, 0x5A, 0x83, 0x45, 0x0C, 0x57, 0x83, 0x45, 0x0C, 0x53, 0x83, 0x45, 0x0C, 0x4F, 0x83, 0x45, + 0x0C, 0x4B, 0x83, 0x45, 0x0C, 0x47, 0x83, 0x45, 0x0C, 0x42, 0x83, 0x45, 0x0C, 0x3D, 0x83, 0x45, + 0x0C, 0x37, 0x83, 0x45, 0x0C, 0x31, 0x83, 0x45, 0x0C, 0x2B, 0x83, 0x45, 0x0C, 0x25, 0x83, 0x45, + 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x19, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, + 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x06, 0x82, 0x45, 0x0C, 0x05, 0x81, 0x44, + 0x0A, 0x03, 0x83, 0x45, 0x0D, 0x02, 0x8C, 0x53, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x43, 0x09, 0x01, 0x81, 0x43, 0x0A, 0x02, 0x82, 0x45, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x82, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, + 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x18, 0x83, 0x45, + 0x0C, 0x1E, 0x83, 0x45, 0x0C, 0x24, 0x83, 0x45, 0x0C, 0x2A, 0x83, 0x45, 0x0C, 0x31, 0x83, 0x45, + 0x0C, 0x39, 0x83, 0x45, 0x0C, 0x40, 0x83, 0x45, 0x0C, 0x46, 0x83, 0x45, 0x0C, 0x4C, 0x82, 0x45, + 0x0C, 0x52, 0x83, 0x45, 0x0C, 0x57, 0x83, 0x45, 0x0C, 0x5C, 0x83, 0x45, 0x0C, 0x60, 0x83, 0x45, + 0x0C, 0x65, 0x83, 0x45, 0x0C, 0x68, 0x83, 0x45, 0x0C, 0x6C, 0x83, 0x45, 0x0C, 0x6E, 0x83, 0x45, + 0x0C, 0x71, 0x83, 0x45, 0x0C, 0x73, 0x83, 0x45, 0x0C, 0x76, 0x83, 0x45, 0x0C, 0x78, 0x82, 0x45, + 0x0C, 0x7B, 0x83, 0x45, 0x0C, 0x7D, 0x82, 0x45, 0x0C, 0x7F, 0x82, 0x45, 0x0C, 0x81, 0x82, 0x45, + 0x0C, 0x83, 0x83, 0x45, 0x0D, 0x84, 0x82, 0x45, 0x0C, 0x86, 0x83, 0x45, 0x0C, 0x86, 0x83, 0x45, + 0x0C, 0x87, 0x83, 0x45, 0x0C, 0x88, 0x83, 0x45, 0x0C, 0x89, 0x83, 0x45, 0x0C, 0x8A, 0x83, 0x45, + 0x0C, 0x8B, 0x83, 0x45, 0x0C, 0x8C, 0x83, 0x45, 0x0C, 0x8D, 0x83, 0x44, 0x0B, 0x8E, 0x82, 0x45, + 0x0B, 0x8F, 0x83, 0x45, 0x0B, 0x90, 0x83, 0x45, 0x0B, 0x8F, 0x84, 0x45, 0x0B, 0x90, 0x84, 0x45, + 0x0B, 0x8F, 0x84, 0x45, 0x0B, 0x90, 0x84, 0x45, 0x0A, 0x91, 0x84, 0x44, 0x0A, 0x91, 0x84, 0x45, + 0x0B, 0x92, 0x84, 0x44, 0x0A, 0x92, 0x83, 0x45, 0x0B, 0x93, 0x83, 0x44, 0x0A, 0x92, 0x82, 0x45, + 0x0B, 0x93, 0x83, 0x45, 0x0B, 0x92, 0x83, 0x45, 0x0B, 0x92, 0x84, 0x45, 0x0B, 0x91, 0x83, 0x46, + 0x0C, 0x90, 0x84, 0x46, 0x0D, 0x8F, 0x83, 0x45, 0x0C, 0x8F, 0x83, 0x45, 0x0C, 0x8E, 0x83, 0x45, + 0x0C, 0x8D, 0x83, 0x45, 0x0C, 0x8B, 0x83, 0x45, 0x0C, 0x8A, 0x83, 0x45, 0x0C, 0x89, 0x83, 0x45, + 0x0C, 0x89, 0x83, 0x45, 0x0C, 0x87, 0x83, 0x45, 0x0C, 0x87, 0x83, 0x45, 0x0C, 0x85, 0x83, 0x45, + 0x0C, 0x84, 0x83, 0x45, 0x0C, 0x81, 0x83, 0x45, 0x0C, 0x81, 0x83, 0x45, 0x0C, 0x7F, 0x82, 0x45, + 0x0C, 0x7D, 0x83, 0x45, 0x0C, 0x7B, 0x82, 0x45, 0x0C, 0x7A, 0x83, 0x45, 0x0C, 0x78, 0x82, 0x45, + 0x0C, 0x76, 0x83, 0x45, 0x0C, 0x72, 0x82, 0x45, 0x0C, 0x6F, 0x83, 0x45, 0x0C, 0x6C, 0x83, 0x45, + 0x0C, 0x69, 0x83, 0x45, 0x0C, 0x66, 0x83, 0x45, 0x0C, 0x62, 0x83, 0x45, 0x0C, 0x5D, 0x83, 0x45, + 0x0C, 0x59, 0x83, 0x45, 0x0C, 0x54, 0x83, 0x45, 0x0C, 0x4E, 0x83, 0x45, 0x0C, 0x49, 0x83, 0x45, + 0x0C, 0x42, 0x83, 0x45, 0x0C, 0x3B, 0x83, 0x45, 0x0C, 0x34, 0x83, 0x45, 0x0C, 0x2D, 0x83, 0x45, + 0x0C, 0x26, 0x83, 0x45, 0x0C, 0x1F, 0x82, 0x45, 0x0C, 0x19, 0x83, 0x45, 0x0C, 0x14, 0x82, 0x45, + 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x0B, 0x82, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x06, 0x82, 0x44, + 0x0B, 0x04, 0x84, 0x46, 0x0F, 0x03, 0x8C, 0x53, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x43, 0x09, 0x01, 0x81, 0x43, 0x09, 0x02, 0x82, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x04, 0x82, 0x45, 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, + 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x17, 0x83, 0x45, 0x0C, 0x1D, 0x83, 0x45, + 0x0C, 0x24, 0x83, 0x45, 0x0C, 0x2A, 0x83, 0x45, 0x0C, 0x33, 0x83, 0x45, 0x0C, 0x3B, 0x83, 0x45, + 0x0C, 0x44, 0x83, 0x45, 0x0C, 0x4B, 0x83, 0x45, 0x0C, 0x53, 0x83, 0x45, 0x0C, 0x59, 0x83, 0x45, + 0x0C, 0x60, 0x83, 0x45, 0x0C, 0x65, 0x83, 0x45, 0x0C, 0x6B, 0x83, 0x45, 0x0C, 0x6F, 0x83, 0x45, + 0x0C, 0x74, 0x83, 0x45, 0x0C, 0x77, 0x83, 0x45, 0x0C, 0x7C, 0x83, 0x45, 0x0C, 0x7F, 0x83, 0x45, + 0x0C, 0x81, 0x83, 0x45, 0x0C, 0x83, 0x83, 0x45, 0x0C, 0x87, 0x83, 0x45, 0x0C, 0x88, 0x82, 0x45, + 0x0C, 0x8A, 0x82, 0x45, 0x0C, 0x8C, 0x82, 0x44, 0x0C, 0x8D, 0x82, 0x45, 0x0C, 0x8E, 0x83, 0x45, + 0x0D, 0x8F, 0x83, 0x45, 0x0C, 0x91, 0x83, 0x45, 0x0C, 0x92, 0x83, 0x45, 0x0B, 0x95, 0x83, 0x45, + 0x0B, 0x96, 0x83, 0x45, 0x0B, 0x98, 0x83, 0x45, 0x0C, 0x99, 0x82, 0x44, 0x0A, 0x99, 0x82, 0x45, + 0x0B, 0x99, 0x81, 0x44, 0x0B, 0x9A, 0x81, 0x42, 0x09, 0x9B, 0x83, 0x45, 0x0B, 0x9C, 0x84, 0x46, + 0x0C, 0x9C, 0x85, 0x48, 0x0F, 0x9E, 0x86, 0x49, 0x10, 0xA1, 0x87, 0x4A, 0x12, 0xA1, 0x86, 0x4A, + 0x13, 0xA2, 0x86, 0x4A, 0x13, 0xA2, 0x87, 0x49, 0x13, 0xA3, 0x86, 0x4A, 0x14, 0xA4, 0x86, 0x49, + 0x13, 0xA4, 0x86, 0x49, 0x13, 0xA2, 0x84, 0x48, 0x12, 0xA1, 0x84, 0x47, 0x11, 0xA0, 0x83, 0x46, + 0x10, 0x9F, 0x82, 0x45, 0x0E, 0xA0, 0x80, 0x43, 0x0B, 0x9F, 0x81, 0x42, 0x0B, 0x9E, 0x82, 0x44, + 0x0C, 0x9D, 0x83, 0x45, 0x0D, 0x9D, 0x83, 0x45, 0x0D, 0x9D, 0x83, 0x44, 0x0C, 0x9C, 0x83, 0x44, + 0x0B, 0x9A, 0x82, 0x43, 0x0A, 0x99, 0x83, 0x45, 0x0B, 0x97, 0x83, 0x45, 0x0B, 0x96, 0x83, 0x45, + 0x0C, 0x96, 0x83, 0x45, 0x0C, 0x95, 0x83, 0x45, 0x0C, 0x94, 0x83, 0x45, 0x0C, 0x93, 0x83, 0x45, + 0x0C, 0x92, 0x83, 0x45, 0x0D, 0x91, 0x83, 0x45, 0x0C, 0x90, 0x83, 0x45, 0x0C, 0x8E, 0x83, 0x45, + 0x0C, 0x8C, 0x83, 0x45, 0x0C, 0x8A, 0x83, 0x45, 0x0C, 0x88, 0x83, 0x45, 0x0C, 0x86, 0x82, 0x45, + 0x0C, 0x85, 0x83, 0x45, 0x0C, 0x82, 0x83, 0x45, 0x0C, 0x7F, 0x83, 0x45, 0x0C, 0x7C, 0x83, 0x45, + 0x0C, 0x78, 0x83, 0x45, 0x0C, 0x75, 0x83, 0x45, 0x0C, 0x70, 0x83, 0x45, 0x0C, 0x6D, 0x83, 0x45, + 0x0C, 0x67, 0x83, 0x45, 0x0C, 0x62, 0x83, 0x45, 0x0C, 0x5B, 0x83, 0x45, 0x0C, 0x55, 0x83, 0x45, + 0x0C, 0x4D, 0x83, 0x45, 0x0C, 0x46, 0x83, 0x45, 0x0C, 0x3D, 0x83, 0x45, 0x0C, 0x36, 0x83, 0x45, + 0x0C, 0x2D, 0x83, 0x45, 0x0C, 0x26, 0x83, 0x45, 0x0C, 0x1E, 0x83, 0x45, 0x0C, 0x18, 0x82, 0x45, + 0x0C, 0x12, 0x82, 0x45, 0x0C, 0x0E, 0x82, 0x45, 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x07, 0x82, 0x44, + 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x03, 0x81, 0x45, 0x0E, 0x02, 0x85, 0x49, 0x14, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x43, 0x0A, 0x01, 0x82, 0x43, 0x0A, 0x02, 0x82, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x04, 0x82, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x0A, 0x82, 0x45, + 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x13, 0x83, 0x45, 0x0C, 0x1A, 0x83, 0x45, 0x0C, 0x21, 0x83, 0x45, + 0x0C, 0x28, 0x83, 0x45, 0x0C, 0x30, 0x83, 0x45, 0x0C, 0x3A, 0x83, 0x45, 0x0C, 0x43, 0x82, 0x45, + 0x0C, 0x4C, 0x83, 0x45, 0x0C, 0x54, 0x82, 0x45, 0x0C, 0x5C, 0x83, 0x45, 0x0C, 0x63, 0x83, 0x45, + 0x0C, 0x6B, 0x83, 0x45, 0x0C, 0x71, 0x83, 0x45, 0x0C, 0x76, 0x83, 0x45, 0x0C, 0x7B, 0x83, 0x45, + 0x0C, 0x7F, 0x83, 0x45, 0x0C, 0x83, 0x83, 0x45, 0x0C, 0x87, 0x83, 0x45, 0x0C, 0x8A, 0x82, 0x45, + 0x0C, 0x8D, 0x82, 0x45, 0x0C, 0x8F, 0x82, 0x45, 0x0C, 0x92, 0x83, 0x45, 0x0C, 0x94, 0x82, 0x45, + 0x0C, 0x96, 0x83, 0x45, 0x0C, 0x98, 0x82, 0x45, 0x0C, 0x9A, 0x83, 0x45, 0x0C, 0x9C, 0x83, 0x46, + 0x0D, 0x9C, 0x83, 0x45, 0x0D, 0x9D, 0x82, 0x45, 0x0C, 0x9E, 0x83, 0x45, 0x0C, 0x9F, 0x82, 0x44, + 0x0B, 0xA1, 0x83, 0x44, 0x0B, 0xA1, 0x82, 0x44, 0x0A, 0xA3, 0x82, 0x46, 0x0C, 0xA6, 0x85, 0x49, + 0x0F, 0xA8, 0x89, 0x4C, 0x14, 0xAA, 0x8D, 0x52, 0x1B, 0xAD, 0x8F, 0x56, 0x22, 0xAE, 0x91, 0x5B, + 0x28, 0xB2, 0x93, 0x5F, 0x30, 0xB6, 0x95, 0x62, 0x36, 0xBA, 0x96, 0x64, 0x3B, 0xBD, 0x97, 0x65, + 0x3C, 0xBF, 0x97, 0x66, 0x3D, 0xC0, 0x96, 0x67, 0x3C, 0xC2, 0x97, 0x68, 0x3C, 0xC0, 0x97, 0x69, + 0x3C, 0xC0, 0x97, 0x68, 0x3C, 0xBE, 0x98, 0x67, 0x3B, 0xBE, 0x97, 0x64, 0x38, 0xBC, 0x96, 0x63, + 0x35, 0xBA, 0x93, 0x5E, 0x2E, 0xB6, 0x8F, 0x59, 0x27, 0xB3, 0x8A, 0x51, 0x1C, 0xAF, 0x88, 0x4B, + 0x15, 0xAC, 0x84, 0x46, 0x10, 0xA9, 0x82, 0x44, 0x0C, 0xA9, 0x82, 0x43, 0x0B, 0xA8, 0x82, 0x43, + 0x0A, 0xA8, 0x83, 0x43, 0x0A, 0xA5, 0x82, 0x44, 0x0C, 0xA4, 0x82, 0x44, 0x0A, 0xA3, 0x83, 0x45, + 0x0B, 0xA2, 0x84, 0x45, 0x0C, 0xA1, 0x84, 0x46, 0x0C, 0xA0, 0x83, 0x45, 0x0C, 0x9E, 0x83, 0x45, + 0x0C, 0x9E, 0x83, 0x45, 0x0C, 0x9C, 0x83, 0x45, 0x0C, 0x9C, 0x83, 0x45, 0x0C, 0x99, 0x82, 0x45, + 0x0C, 0x98, 0x83, 0x45, 0x0C, 0x95, 0x83, 0x45, 0x0C, 0x93, 0x83, 0x45, 0x0C, 0x91, 0x82, 0x45, + 0x0C, 0x8F, 0x83, 0x45, 0x0C, 0x8D, 0x82, 0x45, 0x0C, 0x8B, 0x83, 0x45, 0x0C, 0x87, 0x82, 0x45, + 0x0C, 0x84, 0x83, 0x45, 0x0C, 0x80, 0x82, 0x45, 0x0C, 0x7C, 0x83, 0x45, 0x0C, 0x78, 0x83, 0x45, + 0x0C, 0x73, 0x83, 0x45, 0x0C, 0x6D, 0x83, 0x45, 0x0C, 0x66, 0x83, 0x45, 0x0C, 0x5E, 0x83, 0x45, + 0x0C, 0x56, 0x83, 0x45, 0x0C, 0x4E, 0x83, 0x45, 0x0C, 0x45, 0x83, 0x45, 0x0C, 0x3D, 0x83, 0x45, + 0x0C, 0x33, 0x83, 0x45, 0x0C, 0x2B, 0x82, 0x45, 0x0C, 0x23, 0x83, 0x45, 0x0C, 0x1C, 0x82, 0x45, + 0x0C, 0x15, 0x83, 0x45, 0x0C, 0x10, 0x82, 0x45, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, + 0x0C, 0x05, 0x83, 0x45, 0x0D, 0x04, 0x83, 0x45, 0x0D, 0x03, 0x83, 0x46, 0x0D, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x46, 0x0E, 0x01, 0x84, 0x46, 0x0E, 0x03, 0x83, 0x45, + 0x0D, 0x04, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, + 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x16, 0x83, 0x45, 0x0C, 0x1D, 0x83, 0x45, 0x0C, 0x24, 0x83, 0x45, + 0x0C, 0x2E, 0x83, 0x45, 0x0C, 0x36, 0x83, 0x45, 0x0C, 0x40, 0x83, 0x45, 0x0C, 0x49, 0x83, 0x45, + 0x0C, 0x53, 0x83, 0x45, 0x0C, 0x5C, 0x83, 0x45, 0x0C, 0x65, 0x83, 0x45, 0x0C, 0x6D, 0x83, 0x45, + 0x0C, 0x75, 0x83, 0x45, 0x0C, 0x7B, 0x83, 0x45, 0x0D, 0x81, 0x83, 0x45, 0x0C, 0x85, 0x83, 0x45, + 0x0C, 0x8A, 0x83, 0x45, 0x0C, 0x8E, 0x83, 0x45, 0x0C, 0x91, 0x83, 0x45, 0x0C, 0x95, 0x83, 0x45, + 0x0C, 0x97, 0x82, 0x45, 0x0C, 0x9A, 0x82, 0x44, 0x0C, 0x9C, 0x83, 0x45, 0x0C, 0x9E, 0x84, 0x45, + 0x0D, 0xA0, 0x84, 0x45, 0x0C, 0xA3, 0x84, 0x45, 0x0B, 0xA4, 0x83, 0x45, 0x0C, 0xA6, 0x83, 0x46, + 0x0D, 0xA7, 0x83, 0x45, 0x0C, 0xA8, 0x83, 0x44, 0x0C, 0xAA, 0x84, 0x47, 0x0F, 0xAA, 0x88, 0x4B, + 0x14, 0xAC, 0x8B, 0x50, 0x1C, 0xB3, 0x91, 0x59, 0x2A, 0xB9, 0x98, 0x63, 0x39, 0xC0, 0x9D, 0x6A, + 0x42, 0xC7, 0x9E, 0x6F, 0x4C, 0xCC, 0xA0, 0x74, 0x52, 0xD2, 0xA0, 0x77, 0x57, 0xD9, 0x9F, 0x77, + 0x5A, 0xE1, 0x9D, 0x77, 0x5B, 0xE7, 0x9C, 0x76, 0x5A, 0xED, 0x9B, 0x74, 0x5A, 0xF0, 0x9A, 0x74, + 0x5A, 0xF3, 0x9A, 0x74, 0x5A, 0xF3, 0x9B, 0x75, 0x5A, 0xF4, 0x9B, 0x75, 0x5B, 0xF3, 0x9C, 0x77, + 0x5C, 0xF2, 0x9C, 0x77, 0x5C, 0xF2, 0x9D, 0x78, 0x5E, 0xF1, 0x9E, 0x78, 0x5E, 0xEE, 0x9E, 0x78, + 0x5D, 0xE9, 0xA1, 0x78, 0x5C, 0xE2, 0x9F, 0x78, 0x59, 0xDC, 0x9F, 0x76, 0x54, 0xD5, 0x9D, 0x71, + 0x4C, 0xD1, 0x9D, 0x6C, 0x43, 0xCA, 0x98, 0x66, 0x3B, 0xC6, 0x94, 0x5E, 0x2E, 0xBF, 0x8D, 0x54, + 0x22, 0xB8, 0x87, 0x4C, 0x16, 0xB5, 0x84, 0x47, 0x11, 0xAF, 0x83, 0x45, 0x0E, 0xAC, 0x82, 0x45, + 0x0D, 0xAB, 0x83, 0x45, 0x0C, 0xAB, 0x84, 0x45, 0x0C, 0xAA, 0x83, 0x44, 0x0C, 0xA8, 0x84, 0x45, + 0x0C, 0xA7, 0x83, 0x45, 0x0C, 0xA6, 0x83, 0x45, 0x0C, 0xA5, 0x83, 0x45, 0x0C, 0xA3, 0x83, 0x45, + 0x0C, 0xA1, 0x83, 0x45, 0x0D, 0xA0, 0x83, 0x45, 0x0C, 0x9E, 0x83, 0x45, 0x0C, 0x9C, 0x83, 0x45, + 0x0C, 0x9A, 0x83, 0x45, 0x0C, 0x97, 0x83, 0x45, 0x0C, 0x95, 0x83, 0x45, 0x0C, 0x92, 0x82, 0x45, + 0x0C, 0x8E, 0x83, 0x45, 0x0C, 0x8A, 0x83, 0x45, 0x0C, 0x86, 0x83, 0x45, 0x0C, 0x82, 0x83, 0x45, + 0x0C, 0x7D, 0x83, 0x45, 0x0C, 0x77, 0x83, 0x45, 0x0C, 0x6F, 0x83, 0x45, 0x0C, 0x68, 0x83, 0x45, + 0x0C, 0x5E, 0x83, 0x45, 0x0C, 0x56, 0x83, 0x45, 0x0C, 0x4C, 0x83, 0x45, 0x0C, 0x43, 0x83, 0x45, + 0x0C, 0x39, 0x83, 0x45, 0x0C, 0x30, 0x83, 0x45, 0x0C, 0x28, 0x83, 0x45, 0x0C, 0x1F, 0x82, 0x45, + 0x0C, 0x18, 0x82, 0x45, 0x0C, 0x12, 0x82, 0x45, 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, + 0x0D, 0x06, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x47, 0x0F, 0x02, 0x84, 0x46, 0x0E, 0x03, 0x83, 0x45, + 0x0D, 0x04, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x0D, 0x82, 0x45, + 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x18, 0x82, 0x45, 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x27, 0x83, 0x45, + 0x0C, 0x31, 0x83, 0x45, 0x0C, 0x3A, 0x82, 0x45, 0x0C, 0x44, 0x83, 0x45, 0x0C, 0x4E, 0x83, 0x45, + 0x0C, 0x59, 0x83, 0x45, 0x0C, 0x62, 0x83, 0x45, 0x0C, 0x6C, 0x83, 0x45, 0x0C, 0x74, 0x83, 0x45, + 0x0C, 0x7C, 0x83, 0x45, 0x0C, 0x82, 0x83, 0x45, 0x0C, 0x88, 0x83, 0x45, 0x0C, 0x8D, 0x82, 0x45, + 0x0C, 0x92, 0x83, 0x45, 0x0C, 0x95, 0x82, 0x45, 0x0C, 0x99, 0x83, 0x45, 0x0D, 0x9C, 0x82, 0x45, + 0x0C, 0x9F, 0x83, 0x45, 0x0D, 0xA1, 0x83, 0x45, 0x0C, 0xA3, 0x83, 0x45, 0x0C, 0xA5, 0x83, 0x45, + 0x0C, 0xA7, 0x83, 0x44, 0x0B, 0xA9, 0x83, 0x45, 0x0B, 0xAA, 0x84, 0x46, 0x0C, 0xAB, 0x84, 0x47, + 0x0B, 0xAE, 0x8A, 0x4C, 0x13, 0xB2, 0x8E, 0x54, 0x21, 0xB9, 0x95, 0x5F, 0x32, 0xC3, 0x98, 0x69, + 0x42, 0xCD, 0x9E, 0x72, 0x50, 0xD6, 0xA1, 0x78, 0x59, 0xDF, 0xA0, 0x78, 0x5A, 0xE7, 0x9E, 0x77, + 0x59, 0xEF, 0x9B, 0x75, 0x58, 0xF6, 0x99, 0x73, 0x56, 0xFA, 0x98, 0x72, 0x57, 0xFC, 0x99, 0x73, + 0x58, 0xFE, 0x9B, 0x74, 0x59, 0xFF, 0x9B, 0x74, 0x5A, 0xFF, 0x9B, 0x75, 0x5B, 0xFF, 0x9B, 0x75, + 0x5B, 0xFE, 0x9B, 0x74, 0x5B, 0xFF, 0x9A, 0x74, 0x5B, 0xFF, 0x9A, 0x74, 0x5B, 0xFF, 0x99, 0x74, + 0x5B, 0xFF, 0x99, 0x74, 0x5B, 0xFE, 0x99, 0x75, 0x5C, 0xFF, 0x9B, 0x76, 0x5D, 0xFE, 0x9C, 0x77, + 0x5D, 0xFF, 0x9D, 0x77, 0x5D, 0xFD, 0x9D, 0x77, 0x5C, 0xFD, 0x9F, 0x79, 0x5D, 0xFA, 0xA1, 0x7B, + 0x5F, 0xF8, 0xA4, 0x7C, 0x62, 0xF2, 0xA5, 0x7F, 0x63, 0xEE, 0xA5, 0x7D, 0x61, 0xE5, 0xA2, 0x7A, + 0x59, 0xDC, 0x9D, 0x70, 0x4C, 0xD1, 0x97, 0x65, 0x39, 0xCA, 0x8F, 0x57, 0x25, 0xC1, 0x89, 0x4D, + 0x18, 0xB9, 0x84, 0x47, 0x10, 0xB4, 0x83, 0x44, 0x0C, 0xB2, 0x83, 0x43, 0x0B, 0xAE, 0x83, 0x45, + 0x0C, 0xAD, 0x83, 0x45, 0x0B, 0xAC, 0x84, 0x46, 0x0C, 0xAB, 0x84, 0x45, 0x0C, 0xA9, 0x83, 0x45, + 0x0D, 0xA9, 0x83, 0x45, 0x0C, 0xA8, 0x83, 0x45, 0x0C, 0xA7, 0x83, 0x45, 0x0C, 0xA5, 0x82, 0x45, + 0x0C, 0xA2, 0x83, 0x45, 0x0C, 0x9F, 0x83, 0x45, 0x0C, 0x9D, 0x83, 0x45, 0x0C, 0x9A, 0x82, 0x45, + 0x0C, 0x96, 0x83, 0x45, 0x0C, 0x93, 0x82, 0x45, 0x0C, 0x8F, 0x83, 0x45, 0x0C, 0x8B, 0x82, 0x45, + 0x0C, 0x85, 0x83, 0x45, 0x0C, 0x7E, 0x83, 0x45, 0x0C, 0x76, 0x83, 0x45, 0x0C, 0x6E, 0x83, 0x45, + 0x0C, 0x65, 0x83, 0x45, 0x0C, 0x5B, 0x83, 0x45, 0x0C, 0x52, 0x83, 0x45, 0x0C, 0x47, 0x83, 0x45, + 0x0C, 0x3D, 0x83, 0x45, 0x0C, 0x33, 0x83, 0x45, 0x0C, 0x2A, 0x83, 0x45, 0x0C, 0x21, 0x82, 0x45, + 0x0C, 0x19, 0x83, 0x45, 0x0C, 0x13, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, + 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x44, 0x0B, 0x03, 0x83, 0x44, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x47, 0x0F, 0x02, 0x84, 0x46, 0x0F, 0x03, 0x83, 0x45, + 0x0D, 0x04, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, + 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x18, 0x83, 0x45, 0x0C, 0x20, 0x83, 0x45, 0x0C, 0x28, 0x83, 0x45, + 0x0C, 0x32, 0x83, 0x45, 0x0C, 0x3C, 0x83, 0x45, 0x0C, 0x47, 0x83, 0x45, 0x0C, 0x51, 0x83, 0x45, + 0x0C, 0x5C, 0x83, 0x45, 0x0C, 0x65, 0x83, 0x45, 0x0D, 0x70, 0x83, 0x45, 0x0C, 0x78, 0x83, 0x45, + 0x0D, 0x80, 0x83, 0x45, 0x0C, 0x86, 0x83, 0x45, 0x0C, 0x8D, 0x83, 0x45, 0x0C, 0x91, 0x83, 0x45, + 0x0C, 0x96, 0x83, 0x45, 0x0C, 0x99, 0x83, 0x44, 0x0C, 0x9D, 0x83, 0x45, 0x0C, 0x9F, 0x83, 0x45, + 0x0D, 0xA2, 0x83, 0x45, 0x0C, 0xA4, 0x83, 0x45, 0x0C, 0xA6, 0x83, 0x45, 0x0C, 0xA9, 0x84, 0x45, + 0x0D, 0xAC, 0x84, 0x45, 0x0E, 0xAE, 0x88, 0x4A, 0x13, 0xB1, 0x8E, 0x54, 0x21, 0xBA, 0x99, 0x62, + 0x37, 0xC4, 0x9E, 0x6F, 0x4C, 0xD0, 0xA2, 0x77, 0x58, 0xDE, 0xA1, 0x7A, 0x5E, 0xE9, 0x9F, 0x78, + 0x5E, 0xF3, 0x9A, 0x75, 0x5B, 0xFA, 0x96, 0x71, 0x57, 0xFD, 0x92, 0x6C, 0x52, 0xFF, 0x8F, 0x68, + 0x4E, 0xFF, 0x8B, 0x65, 0x4A, 0xFF, 0x8A, 0x63, 0x47, 0xFF, 0x87, 0x5F, 0x44, 0xFF, 0x87, 0x5D, + 0x42, 0xFF, 0x85, 0x5B, 0x41, 0xFF, 0x83, 0x5A, 0x3F, 0xFF, 0x82, 0x59, 0x3E, 0xFF, 0x83, 0x57, + 0x3C, 0xFF, 0x82, 0x57, 0x3C, 0xFF, 0x82, 0x56, 0x3B, 0xFF, 0x81, 0x56, 0x3B, 0xFF, 0x82, 0x57, + 0x3D, 0xFF, 0x83, 0x59, 0x3F, 0xFF, 0x84, 0x5B, 0x41, 0xFF, 0x86, 0x5E, 0x43, 0xFF, 0x88, 0x60, + 0x45, 0xFF, 0x8A, 0x62, 0x48, 0xFF, 0x8C, 0x65, 0x4A, 0xFF, 0x8F, 0x69, 0x4E, 0xFF, 0x92, 0x6D, + 0x52, 0xFF, 0x95, 0x70, 0x55, 0xFF, 0x97, 0x72, 0x58, 0xFE, 0x99, 0x74, 0x5A, 0xFD, 0x9B, 0x78, + 0x5E, 0xFA, 0xA0, 0x7B, 0x61, 0xF6, 0xA0, 0x7D, 0x61, 0xEF, 0xA3, 0x7C, 0x5D, 0xE4, 0xA0, 0x78, + 0x54, 0xD8, 0x9C, 0x6C, 0x41, 0xCC, 0x92, 0x5B, 0x2C, 0xC1, 0x89, 0x4D, 0x17, 0xB9, 0x83, 0x45, + 0x0E, 0xB3, 0x84, 0x45, 0x0C, 0xB0, 0x83, 0x45, 0x0C, 0xAE, 0x83, 0x45, 0x0C, 0xAD, 0x84, 0x45, + 0x0D, 0xAC, 0x83, 0x45, 0x0C, 0xAB, 0x84, 0x45, 0x0C, 0xAA, 0x83, 0x45, 0x0D, 0xA9, 0x83, 0x45, + 0x0C, 0xA6, 0x83, 0x45, 0x0D, 0xA4, 0x83, 0x45, 0x0C, 0xA1, 0x83, 0x45, 0x0C, 0x9F, 0x83, 0x45, + 0x0C, 0x9A, 0x83, 0x45, 0x0C, 0x97, 0x82, 0x45, 0x0C, 0x93, 0x83, 0x45, 0x0C, 0x8F, 0x83, 0x45, + 0x0C, 0x88, 0x83, 0x45, 0x0C, 0x82, 0x83, 0x45, 0x0C, 0x7A, 0x83, 0x45, 0x0C, 0x72, 0x83, 0x45, + 0x0C, 0x69, 0x83, 0x45, 0x0C, 0x5F, 0x83, 0x45, 0x0C, 0x55, 0x83, 0x45, 0x0C, 0x4A, 0x83, 0x45, + 0x0C, 0x3F, 0x83, 0x45, 0x0C, 0x35, 0x83, 0x45, 0x0C, 0x2B, 0x83, 0x45, 0x0C, 0x22, 0x82, 0x45, + 0x0C, 0x1B, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x0B, 0x82, 0x45, + 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x04, 0x82, 0x44, 0x0B, 0x02, 0x83, 0x44, 0x0C, 0x01, 0x87, 0x49, + 0x12, 0x01, 0x88, 0x4C, 0x15, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x47, 0x0F, 0x01, 0x83, 0x46, 0x0E, 0x03, 0x83, 0x45, + 0x0D, 0x04, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x0C, 0x82, 0x45, + 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x18, 0x82, 0x45, 0x0C, 0x20, 0x83, 0x45, 0x0C, 0x28, 0x82, 0x45, + 0x0C, 0x32, 0x83, 0x45, 0x0C, 0x3C, 0x83, 0x45, 0x0C, 0x47, 0x83, 0x45, 0x0C, 0x51, 0x83, 0x45, + 0x0C, 0x5C, 0x83, 0x45, 0x0C, 0x65, 0x83, 0x45, 0x0C, 0x6F, 0x83, 0x45, 0x0C, 0x78, 0x83, 0x45, + 0x0C, 0x80, 0x83, 0x45, 0x0C, 0x86, 0x82, 0x45, 0x0C, 0x8C, 0x83, 0x45, 0x0C, 0x91, 0x83, 0x45, + 0x0C, 0x95, 0x83, 0x44, 0x0D, 0x99, 0x83, 0x45, 0x0C, 0x9C, 0x83, 0x45, 0x0C, 0xA0, 0x83, 0x45, + 0x0C, 0xA3, 0x83, 0x45, 0x0C, 0xA5, 0x83, 0x46, 0x0C, 0xA8, 0x86, 0x48, 0x0F, 0xAB, 0x88, 0x4D, + 0x14, 0xB1, 0x93, 0x5C, 0x29, 0xBC, 0x9A, 0x6B, 0x42, 0xCB, 0x9F, 0x75, 0x54, 0xDD, 0x9F, 0x79, + 0x59, 0xEB, 0x9C, 0x76, 0x59, 0xF5, 0x96, 0x6F, 0x53, 0xFC, 0x92, 0x6A, 0x4E, 0xFF, 0x8F, 0x66, + 0x4B, 0xFF, 0x8A, 0x60, 0x44, 0xFF, 0x87, 0x5B, 0x40, 0xFF, 0x84, 0x57, 0x3C, 0xFF, 0x80, 0x53, + 0x37, 0xFF, 0x7B, 0x4E, 0x33, 0xFF, 0x77, 0x4A, 0x2F, 0xFF, 0x76, 0x48, 0x2D, 0xFF, 0x74, 0x45, + 0x2C, 0xFF, 0x72, 0x44, 0x2A, 0xFF, 0x71, 0x44, 0x2A, 0xFF, 0x71, 0x43, 0x2A, 0xFF, 0x70, 0x43, + 0x2A, 0xFF, 0x71, 0x43, 0x2B, 0xFF, 0x71, 0x44, 0x2B, 0xFF, 0x71, 0x45, 0x2C, 0xFF, 0x71, 0x45, + 0x2C, 0xFF, 0x72, 0x46, 0x2D, 0xFF, 0x72, 0x47, 0x2D, 0xFF, 0x75, 0x49, 0x2F, 0xFF, 0x76, 0x4A, + 0x31, 0xFF, 0x79, 0x4D, 0x34, 0xFF, 0x7B, 0x50, 0x37, 0xFF, 0x7E, 0x52, 0x3A, 0xFF, 0x81, 0x55, + 0x3D, 0xFF, 0x85, 0x5A, 0x42, 0xFF, 0x88, 0x5E, 0x46, 0xFF, 0x8E, 0x66, 0x4D, 0xFF, 0x92, 0x6B, + 0x52, 0xFF, 0x97, 0x70, 0x57, 0xFF, 0x9A, 0x75, 0x5B, 0xFF, 0x9F, 0x79, 0x5D, 0xFE, 0xA2, 0x7B, + 0x60, 0xFB, 0xA5, 0x7E, 0x62, 0xF2, 0xA4, 0x7D, 0x5F, 0xE5, 0xA0, 0x75, 0x53, 0xD5, 0x97, 0x65, + 0x38, 0xC8, 0x8B, 0x52, 0x1D, 0xBC, 0x85, 0x46, 0x0E, 0xB3, 0x83, 0x43, 0x0B, 0xAF, 0x83, 0x46, + 0x0D, 0xAE, 0x83, 0x45, 0x0C, 0xAD, 0x84, 0x46, 0x0C, 0xAC, 0x84, 0x45, 0x0C, 0xA9, 0x83, 0x45, + 0x0D, 0xA7, 0x83, 0x45, 0x0C, 0xA5, 0x83, 0x45, 0x0C, 0xA3, 0x83, 0x45, 0x0C, 0xA0, 0x83, 0x45, + 0x0C, 0x9C, 0x83, 0x45, 0x0C, 0x98, 0x82, 0x45, 0x0C, 0x94, 0x83, 0x45, 0x0C, 0x8F, 0x83, 0x45, + 0x0C, 0x88, 0x83, 0x45, 0x0C, 0x82, 0x82, 0x45, 0x0C, 0x7A, 0x83, 0x45, 0x0C, 0x73, 0x82, 0x45, + 0x0C, 0x69, 0x83, 0x45, 0x0C, 0x5F, 0x83, 0x45, 0x0C, 0x55, 0x83, 0x45, 0x0C, 0x4A, 0x83, 0x45, + 0x0C, 0x40, 0x83, 0x45, 0x0C, 0x35, 0x83, 0x45, 0x0C, 0x2B, 0x83, 0x45, 0x0C, 0x22, 0x83, 0x45, + 0x0C, 0x1B, 0x83, 0x45, 0x0C, 0x15, 0x82, 0x45, 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x0B, 0x82, 0x45, + 0x0C, 0x06, 0x83, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0B, 0x02, 0x83, 0x44, 0x0C, 0x01, 0x87, 0x4A, + 0x12, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x46, 0x0F, 0x02, 0x84, 0x46, 0x0E, 0x03, 0x83, 0x45, + 0x0D, 0x04, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, + 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x17, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x27, 0x83, 0x45, + 0x0C, 0x31, 0x83, 0x45, 0x0C, 0x3A, 0x83, 0x45, 0x0C, 0x45, 0x83, 0x45, 0x0D, 0x4F, 0x83, 0x45, + 0x0D, 0x5A, 0x83, 0x45, 0x0D, 0x63, 0x82, 0x45, 0x0C, 0x6D, 0x83, 0x45, 0x0C, 0x74, 0x83, 0x45, + 0x0C, 0x7D, 0x83, 0x45, 0x0C, 0x83, 0x83, 0x45, 0x0C, 0x89, 0x83, 0x45, 0x0C, 0x8D, 0x84, 0x45, + 0x0C, 0x93, 0x84, 0x45, 0x0C, 0x97, 0x83, 0x45, 0x0C, 0x9A, 0x83, 0x45, 0x0C, 0x9E, 0x84, 0x45, + 0x0D, 0xA0, 0x85, 0x47, 0x11, 0xA3, 0x8F, 0x52, 0x1F, 0xAC, 0x99, 0x64, 0x39, 0xBC, 0xA1, 0x75, + 0x50, 0xD2, 0xA2, 0x7B, 0x5D, 0xE3, 0x9F, 0x78, 0x5C, 0xF3, 0x98, 0x72, 0x56, 0xFA, 0x90, 0x6B, + 0x4F, 0xFD, 0x8B, 0x64, 0x47, 0xFF, 0x86, 0x5C, 0x40, 0xFF, 0x80, 0x55, 0x38, 0xFF, 0x7C, 0x4E, + 0x33, 0xFF, 0x77, 0x49, 0x2E, 0xFF, 0x74, 0x46, 0x2C, 0xFF, 0x71, 0x43, 0x29, 0xFF, 0x70, 0x43, + 0x29, 0xFF, 0x6F, 0x41, 0x27, 0xFF, 0x6F, 0x42, 0x27, 0xFF, 0x6E, 0x41, 0x26, 0xFF, 0x6F, 0x41, + 0x27, 0xFF, 0x6F, 0x42, 0x27, 0xFF, 0x70, 0x42, 0x28, 0xFF, 0x70, 0x42, 0x28, 0xFF, 0x71, 0x43, + 0x29, 0xFF, 0x71, 0x43, 0x29, 0xFF, 0x72, 0x44, 0x2A, 0xFF, 0x72, 0x44, 0x2A, 0xFF, 0x72, 0x46, + 0x2B, 0xFF, 0x72, 0x46, 0x2B, 0xFF, 0x73, 0x47, 0x2C, 0xFF, 0x74, 0x47, 0x2D, 0xFF, 0x75, 0x48, + 0x2E, 0xFF, 0x75, 0x49, 0x2F, 0xFF, 0x76, 0x4B, 0x31, 0xFF, 0x77, 0x4B, 0x32, 0xFF, 0x78, 0x4C, + 0x32, 0xFF, 0x7A, 0x4D, 0x34, 0xFF, 0x7B, 0x4F, 0x35, 0xFF, 0x7D, 0x51, 0x38, 0xFF, 0x81, 0x56, + 0x3C, 0xFF, 0x84, 0x5A, 0x40, 0xFF, 0x88, 0x5F, 0x45, 0xFF, 0x8D, 0x66, 0x4C, 0xFF, 0x91, 0x6C, + 0x52, 0xFF, 0x96, 0x71, 0x56, 0xFE, 0x9C, 0x77, 0x5C, 0xFD, 0xA1, 0x7C, 0x61, 0xF8, 0xA3, 0x7F, + 0x63, 0xEC, 0xA4, 0x7A, 0x59, 0xDA, 0x9C, 0x6D, 0x44, 0xC6, 0x90, 0x57, 0x25, 0xB8, 0x86, 0x48, + 0x11, 0xAF, 0x84, 0x45, 0x0D, 0xA9, 0x84, 0x46, 0x0C, 0xA5, 0x83, 0x45, 0x0D, 0xA3, 0x83, 0x45, + 0x0C, 0xA2, 0x83, 0x44, 0x0C, 0xA0, 0x83, 0x45, 0x0C, 0x9E, 0x83, 0x45, 0x0D, 0x9B, 0x83, 0x45, + 0x0C, 0x97, 0x83, 0x45, 0x0D, 0x93, 0x83, 0x45, 0x0C, 0x8F, 0x83, 0x45, 0x0C, 0x8B, 0x83, 0x45, + 0x0C, 0x84, 0x83, 0x45, 0x0C, 0x7E, 0x83, 0x45, 0x0C, 0x77, 0x83, 0x45, 0x0C, 0x6F, 0x83, 0x45, + 0x0C, 0x66, 0x83, 0x45, 0x0C, 0x5C, 0x83, 0x45, 0x0C, 0x53, 0x83, 0x45, 0x0C, 0x49, 0x83, 0x45, + 0x0C, 0x3F, 0x83, 0x45, 0x0C, 0x34, 0x83, 0x45, 0x0C, 0x2A, 0x83, 0x45, 0x0C, 0x21, 0x83, 0x45, + 0x0C, 0x19, 0x83, 0x45, 0x0C, 0x13, 0x82, 0x45, 0x0C, 0x0E, 0x82, 0x45, 0x0C, 0x0A, 0x82, 0x45, + 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x04, 0x83, 0x44, 0x0B, 0x02, 0x83, 0x44, 0x0B, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, 0x0D, 0x01, 0x83, 0x45, 0x0D, 0x02, 0x83, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x0C, 0x82, 0x45, + 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x16, 0x83, 0x45, 0x0C, 0x1D, 0x83, 0x45, 0x0C, 0x25, 0x83, 0x45, + 0x0C, 0x2E, 0x83, 0x45, 0x0C, 0x37, 0x82, 0x45, 0x0C, 0x41, 0x83, 0x45, 0x0C, 0x4A, 0x83, 0x45, + 0x0C, 0x54, 0x83, 0x45, 0x0C, 0x5D, 0x82, 0x45, 0x0C, 0x66, 0x82, 0x45, 0x0C, 0x6E, 0x82, 0x45, + 0x0C, 0x77, 0x83, 0x44, 0x0C, 0x7C, 0x83, 0x45, 0x0C, 0x82, 0x83, 0x45, 0x0C, 0x85, 0x84, 0x45, + 0x0B, 0x8B, 0x84, 0x45, 0x0C, 0x8F, 0x84, 0x46, 0x0C, 0x92, 0x84, 0x47, 0x0F, 0x97, 0x89, 0x4E, + 0x19, 0xA1, 0x96, 0x60, 0x33, 0xB1, 0x9F, 0x73, 0x4F, 0xCB, 0xA0, 0x79, 0x5A, 0xE5, 0x9B, 0x74, + 0x56, 0xF4, 0x93, 0x6B, 0x4F, 0xFD, 0x8E, 0x64, 0x49, 0xFF, 0x87, 0x5C, 0x41, 0xFF, 0x7E, 0x52, + 0x37, 0xFE, 0x77, 0x49, 0x2E, 0xFF, 0x70, 0x42, 0x27, 0xFF, 0x6F, 0x3F, 0x23, 0xFF, 0x6D, 0x3E, + 0x22, 0xFF, 0x6C, 0x3D, 0x22, 0xFF, 0x6C, 0x3E, 0x23, 0xFF, 0x6C, 0x3E, 0x23, 0xFF, 0x6C, 0x3F, + 0x24, 0xFF, 0x6D, 0x3F, 0x24, 0xFF, 0x6E, 0x40, 0x25, 0xFF, 0x6E, 0x40, 0x25, 0xFF, 0x6F, 0x41, + 0x26, 0xFF, 0x70, 0x42, 0x26, 0xFF, 0x71, 0x43, 0x27, 0xFF, 0x72, 0x43, 0x28, 0xFF, 0x72, 0x44, + 0x29, 0xFF, 0x73, 0x44, 0x29, 0xFF, 0x74, 0x45, 0x2A, 0xFF, 0x74, 0x46, 0x2A, 0xFF, 0x74, 0x46, + 0x2B, 0xFF, 0x74, 0x47, 0x2B, 0xFF, 0x75, 0x48, 0x2C, 0xFF, 0x76, 0x49, 0x2D, 0xFF, 0x76, 0x49, + 0x2E, 0xFF, 0x77, 0x4A, 0x2F, 0xFF, 0x77, 0x4B, 0x30, 0xFF, 0x78, 0x4B, 0x30, 0xFF, 0x78, 0x4B, + 0x31, 0xFF, 0x79, 0x4B, 0x31, 0xFF, 0x78, 0x4C, 0x31, 0xFF, 0x79, 0x4C, 0x32, 0xFF, 0x7A, 0x4D, + 0x34, 0xFF, 0x7C, 0x4F, 0x36, 0xFF, 0x7F, 0x52, 0x38, 0xFF, 0x82, 0x55, 0x3B, 0xFF, 0x86, 0x5B, + 0x41, 0xFF, 0x8C, 0x63, 0x4A, 0xFF, 0x91, 0x69, 0x4F, 0xFF, 0x96, 0x70, 0x55, 0xFF, 0x9E, 0x77, + 0x5B, 0xFF, 0xA4, 0x7D, 0x61, 0xFC, 0xA7, 0x81, 0x65, 0xF1, 0xA7, 0x7E, 0x60, 0xDB, 0x9D, 0x6E, + 0x46, 0xC2, 0x8E, 0x56, 0x23, 0xB0, 0x84, 0x45, 0x0E, 0xA3, 0x82, 0x43, 0x0A, 0x9D, 0x83, 0x45, + 0x0C, 0x9B, 0x83, 0x44, 0x0B, 0x98, 0x84, 0x46, 0x0C, 0x96, 0x83, 0x45, 0x0C, 0x93, 0x83, 0x45, + 0x0D, 0x90, 0x83, 0x45, 0x0C, 0x8D, 0x82, 0x45, 0x0C, 0x89, 0x83, 0x45, 0x0C, 0x84, 0x83, 0x45, + 0x0C, 0x7E, 0x83, 0x45, 0x0C, 0x78, 0x83, 0x45, 0x0C, 0x71, 0x83, 0x45, 0x0C, 0x69, 0x83, 0x45, + 0x0C, 0x5F, 0x83, 0x45, 0x0C, 0x57, 0x82, 0x45, 0x0C, 0x4E, 0x83, 0x45, 0x0C, 0x44, 0x83, 0x45, + 0x0C, 0x3A, 0x83, 0x45, 0x0C, 0x31, 0x82, 0x45, 0x0C, 0x27, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, + 0x0C, 0x17, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x0D, 0x82, 0x45, 0x0C, 0x09, 0x82, 0x45, + 0x0C, 0x06, 0x82, 0x44, 0x0D, 0x04, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x43, 0x0A, 0x01, 0x81, 0x44, 0x0B, 0x02, 0x82, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, + 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, 0x0C, 0x1B, 0x83, 0x45, 0x0C, 0x22, 0x83, 0x45, + 0x0C, 0x2A, 0x83, 0x45, 0x0D, 0x32, 0x83, 0x45, 0x0D, 0x3B, 0x83, 0x45, 0x0C, 0x44, 0x82, 0x45, + 0x0C, 0x4D, 0x83, 0x45, 0x0C, 0x54, 0x83, 0x45, 0x0D, 0x5D, 0x82, 0x44, 0x0C, 0x65, 0x82, 0x44, + 0x0C, 0x6C, 0x82, 0x44, 0x0C, 0x71, 0x83, 0x45, 0x0B, 0x76, 0x84, 0x45, 0x0B, 0x7B, 0x83, 0x44, + 0x0C, 0x80, 0x82, 0x43, 0x0C, 0x84, 0x8B, 0x4E, 0x1A, 0x8E, 0x99, 0x64, 0x39, 0xA4, 0xA3, 0x77, + 0x53, 0xC5, 0xA2, 0x7A, 0x5D, 0xE0, 0x9A, 0x73, 0x57, 0xF3, 0x93, 0x6B, 0x4E, 0xFB, 0x8B, 0x5F, + 0x42, 0xFE, 0x82, 0x55, 0x38, 0xFF, 0x7A, 0x4C, 0x30, 0xFF, 0x73, 0x45, 0x28, 0xFF, 0x6F, 0x40, + 0x25, 0xFF, 0x6D, 0x3D, 0x21, 0xFF, 0x6C, 0x3C, 0x1F, 0xFF, 0x6C, 0x3C, 0x1F, 0xFF, 0x6C, 0x3C, + 0x1F, 0xFF, 0x6C, 0x3C, 0x1F, 0xFF, 0x6C, 0x3D, 0x20, 0xFF, 0x6D, 0x3E, 0x20, 0xFF, 0x6E, 0x3F, + 0x21, 0xFF, 0x6F, 0x3F, 0x22, 0xFF, 0x6F, 0x40, 0x23, 0xFF, 0x70, 0x41, 0x23, 0xFF, 0x71, 0x42, + 0x24, 0xFF, 0x72, 0x43, 0x25, 0xFF, 0x73, 0x43, 0x26, 0xFF, 0x74, 0x44, 0x26, 0xFF, 0x75, 0x45, + 0x27, 0xFF, 0x75, 0x46, 0x28, 0xFF, 0x76, 0x46, 0x29, 0xFF, 0x76, 0x47, 0x29, 0xFF, 0x76, 0x47, + 0x2A, 0xFF, 0x77, 0x48, 0x2A, 0xFF, 0x77, 0x48, 0x2A, 0xFF, 0x78, 0x49, 0x2B, 0xFF, 0x78, 0x49, + 0x2C, 0xFF, 0x79, 0x4A, 0x2C, 0xFF, 0x79, 0x4A, 0x2D, 0xFF, 0x79, 0x4B, 0x2D, 0xFF, 0x79, 0x4B, + 0x2E, 0xFF, 0x79, 0x4C, 0x2E, 0xFF, 0x79, 0x4C, 0x2F, 0xFF, 0x79, 0x4C, 0x30, 0xFF, 0x79, 0x4C, + 0x31, 0xFF, 0x7A, 0x4C, 0x31, 0xFF, 0x7B, 0x4E, 0x33, 0xFF, 0x7D, 0x4F, 0x34, 0xFF, 0x7E, 0x51, + 0x36, 0xFF, 0x80, 0x53, 0x39, 0xFF, 0x83, 0x58, 0x3D, 0xFF, 0x88, 0x5E, 0x44, 0xFF, 0x8F, 0x66, + 0x4C, 0xFF, 0x95, 0x6D, 0x53, 0xFF, 0x9A, 0x74, 0x5A, 0xFF, 0x9E, 0x79, 0x60, 0xFD, 0xA4, 0x80, + 0x66, 0xEE, 0xA7, 0x7F, 0x60, 0xD4, 0x9E, 0x6F, 0x47, 0xB6, 0x8D, 0x52, 0x1F, 0xA1, 0x84, 0x45, + 0x0D, 0x93, 0x83, 0x44, 0x0A, 0x8C, 0x84, 0x45, 0x0B, 0x88, 0x84, 0x45, 0x0C, 0x86, 0x83, 0x45, + 0x0C, 0x85, 0x83, 0x45, 0x0C, 0x83, 0x83, 0x45, 0x0D, 0x7E, 0x83, 0x45, 0x0D, 0x79, 0x83, 0x45, + 0x0C, 0x74, 0x83, 0x45, 0x0D, 0x6E, 0x83, 0x45, 0x0C, 0x67, 0x83, 0x45, 0x0C, 0x60, 0x83, 0x45, + 0x0C, 0x58, 0x83, 0x45, 0x0C, 0x50, 0x83, 0x45, 0x0C, 0x47, 0x83, 0x45, 0x0C, 0x3E, 0x82, 0x45, + 0x0C, 0x34, 0x83, 0x45, 0x0C, 0x2C, 0x83, 0x45, 0x0C, 0x24, 0x83, 0x45, 0x0C, 0x1C, 0x83, 0x45, + 0x0C, 0x15, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x0C, 0x82, 0x45, 0x0C, 0x08, 0x82, 0x45, + 0x0C, 0x05, 0x82, 0x44, 0x0D, 0x03, 0x82, 0x44, 0x0E, 0x02, 0x83, 0x45, 0x0E, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x43, 0x09, 0x01, 0x81, 0x43, 0x0A, 0x02, 0x82, 0x44, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, + 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x11, 0x83, 0x45, 0x0C, 0x17, 0x83, 0x45, 0x0D, 0x1D, 0x83, 0x45, + 0x0D, 0x25, 0x83, 0x45, 0x0D, 0x2C, 0x83, 0x45, 0x0D, 0x34, 0x83, 0x45, 0x0C, 0x3C, 0x82, 0x45, + 0x0B, 0x45, 0x83, 0x45, 0x0C, 0x4C, 0x83, 0x45, 0x0D, 0x53, 0x83, 0x45, 0x0C, 0x5A, 0x83, 0x45, + 0x0C, 0x60, 0x83, 0x45, 0x0D, 0x65, 0x85, 0x47, 0x0D, 0x6B, 0x83, 0x44, 0x0A, 0x71, 0x82, 0x46, + 0x0C, 0x77, 0x91, 0x5C, 0x2A, 0x89, 0xA1, 0x74, 0x4E, 0xAC, 0xA3, 0x7B, 0x5C, 0xD4, 0x9E, 0x74, + 0x57, 0xED, 0x93, 0x68, 0x4C, 0xFA, 0x87, 0x5C, 0x41, 0xFF, 0x7E, 0x51, 0x35, 0xFF, 0x75, 0x46, + 0x2A, 0xFF, 0x6F, 0x40, 0x23, 0xFF, 0x6B, 0x3D, 0x1F, 0xFF, 0x6A, 0x3A, 0x1D, 0xFF, 0x69, 0x3A, + 0x1D, 0xFF, 0x69, 0x39, 0x1D, 0xFF, 0x6A, 0x3A, 0x1D, 0xFF, 0x6B, 0x3A, 0x1D, 0xFF, 0x6C, 0x3B, + 0x1E, 0xFF, 0x6C, 0x3B, 0x1E, 0xFF, 0x6D, 0x3D, 0x1F, 0xFF, 0x6E, 0x3E, 0x1F, 0xFF, 0x6F, 0x3F, + 0x20, 0xFF, 0x70, 0x40, 0x21, 0xFF, 0x71, 0x41, 0x21, 0xFF, 0x72, 0x42, 0x22, 0xFF, 0x73, 0x43, + 0x23, 0xFF, 0x74, 0x44, 0x24, 0xFF, 0x75, 0x44, 0x24, 0xFF, 0x76, 0x45, 0x25, 0xFF, 0x77, 0x46, + 0x26, 0xFF, 0x77, 0x47, 0x27, 0xFF, 0x78, 0x47, 0x28, 0xFF, 0x78, 0x47, 0x28, 0xFF, 0x78, 0x48, + 0x29, 0xFF, 0x79, 0x49, 0x29, 0xFF, 0x79, 0x49, 0x2A, 0xFF, 0x7A, 0x49, 0x2A, 0xFF, 0x7A, 0x4A, + 0x2A, 0xFF, 0x7B, 0x4A, 0x2B, 0xFF, 0x7A, 0x4B, 0x2B, 0xFF, 0x7B, 0x4B, 0x2C, 0xFF, 0x7A, 0x4C, + 0x2C, 0xFF, 0x7B, 0x4C, 0x2D, 0xFF, 0x7B, 0x4C, 0x2E, 0xFF, 0x7B, 0x4C, 0x2F, 0xFF, 0x7B, 0x4D, + 0x2F, 0xFF, 0x7B, 0x4D, 0x30, 0xFF, 0x7C, 0x4E, 0x31, 0xFF, 0x7C, 0x4E, 0x32, 0xFF, 0x7D, 0x4F, + 0x33, 0xFF, 0x7E, 0x50, 0x34, 0xFF, 0x7E, 0x51, 0x35, 0xFF, 0x80, 0x53, 0x38, 0xFF, 0x83, 0x57, + 0x3C, 0xFF, 0x88, 0x5E, 0x43, 0xFF, 0x8E, 0x65, 0x4B, 0xFF, 0x96, 0x6E, 0x54, 0xFF, 0x9E, 0x77, + 0x5D, 0xFF, 0xA4, 0x7E, 0x62, 0xF9, 0xA7, 0x83, 0x65, 0xE6, 0xA8, 0x7F, 0x5E, 0xC5, 0x9A, 0x68, + 0x3A, 0xA1, 0x8A, 0x4F, 0x18, 0x8C, 0x81, 0x42, 0x09, 0x80, 0x82, 0x43, 0x0A, 0x7B, 0x84, 0x46, + 0x0C, 0x79, 0x84, 0x45, 0x0B, 0x76, 0x84, 0x45, 0x0C, 0x72, 0x83, 0x45, 0x0C, 0x6E, 0x83, 0x45, + 0x0D, 0x68, 0x83, 0x45, 0x0C, 0x63, 0x83, 0x45, 0x0C, 0x5C, 0x83, 0x45, 0x0C, 0x55, 0x83, 0x45, + 0x0C, 0x4E, 0x83, 0x45, 0x0C, 0x47, 0x83, 0x45, 0x0C, 0x3E, 0x83, 0x45, 0x0C, 0x36, 0x82, 0x45, + 0x0C, 0x2E, 0x83, 0x45, 0x0C, 0x26, 0x82, 0x45, 0x0C, 0x20, 0x83, 0x45, 0x0C, 0x19, 0x82, 0x45, + 0x0C, 0x13, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, + 0x0C, 0x04, 0x82, 0x45, 0x0C, 0x03, 0x82, 0x45, 0x0E, 0x02, 0x85, 0x48, 0x12, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x43, 0x09, 0x01, 0x81, 0x43, 0x0A, 0x02, 0x82, 0x45, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x08, 0x82, 0x45, + 0x0C, 0x0B, 0x83, 0x45, 0x0D, 0x0F, 0x83, 0x45, 0x0D, 0x14, 0x83, 0x45, 0x0D, 0x19, 0x83, 0x45, + 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x25, 0x83, 0x45, 0x0C, 0x2B, 0x83, 0x45, 0x0C, 0x32, 0x83, 0x45, + 0x0C, 0x3B, 0x83, 0x45, 0x0C, 0x40, 0x83, 0x44, 0x0B, 0x46, 0x84, 0x45, 0x0B, 0x4D, 0x84, 0x46, + 0x0E, 0x53, 0x83, 0x44, 0x0B, 0x59, 0x84, 0x45, 0x0A, 0x61, 0x8F, 0x57, 0x24, 0x6E, 0xA4, 0x76, + 0x4E, 0x91, 0xA4, 0x7C, 0x5E, 0xBC, 0x9D, 0x75, 0x58, 0xE4, 0x95, 0x6B, 0x4D, 0xF7, 0x89, 0x5D, + 0x3E, 0xFD, 0x7E, 0x50, 0x32, 0xFE, 0x76, 0x46, 0x2B, 0xFF, 0x6E, 0x3E, 0x21, 0xFF, 0x6A, 0x3A, + 0x1D, 0xFF, 0x69, 0x38, 0x1A, 0xFF, 0x68, 0x38, 0x1A, 0xFF, 0x69, 0x38, 0x1A, 0xFF, 0x69, 0x39, + 0x1A, 0xFF, 0x6A, 0x39, 0x1B, 0xFF, 0x6B, 0x3A, 0x1B, 0xFF, 0x6C, 0x3A, 0x1C, 0xFF, 0x6E, 0x3B, + 0x1D, 0xFF, 0x6F, 0x3C, 0x1D, 0xFF, 0x6F, 0x3E, 0x1E, 0xFF, 0x70, 0x3F, 0x1F, 0xFF, 0x72, 0x40, + 0x20, 0xFF, 0x73, 0x41, 0x20, 0xFF, 0x74, 0x42, 0x21, 0xFF, 0x75, 0x43, 0x22, 0xFF, 0x76, 0x45, + 0x23, 0xFF, 0x77, 0x45, 0x24, 0xFF, 0x78, 0x46, 0x24, 0xFF, 0x79, 0x47, 0x25, 0xFF, 0x79, 0x47, + 0x25, 0xFF, 0x7A, 0x48, 0x26, 0xFF, 0x7B, 0x49, 0x27, 0xFF, 0x7B, 0x49, 0x27, 0xFF, 0x7C, 0x4A, + 0x28, 0xFF, 0x7C, 0x4B, 0x28, 0xFF, 0x7C, 0x4B, 0x29, 0xFF, 0x7D, 0x4C, 0x2A, 0xFF, 0x7D, 0x4D, + 0x2A, 0xFF, 0x7E, 0x4D, 0x2B, 0xFF, 0x7D, 0x4D, 0x2B, 0xFF, 0x7E, 0x4D, 0x2C, 0xFF, 0x7E, 0x4E, + 0x2C, 0xFF, 0x7E, 0x4E, 0x2D, 0xFF, 0x7E, 0x4E, 0x2D, 0xFF, 0x7E, 0x4E, 0x2E, 0xFF, 0x7D, 0x4F, + 0x2E, 0xFF, 0x7D, 0x4E, 0x2F, 0xFF, 0x7D, 0x4E, 0x2F, 0xFF, 0x7D, 0x4E, 0x30, 0xFF, 0x7D, 0x4F, + 0x31, 0xFF, 0x7E, 0x4F, 0x31, 0xFF, 0x7E, 0x50, 0x32, 0xFF, 0x7E, 0x51, 0x33, 0xFF, 0x7F, 0x52, + 0x35, 0xFF, 0x80, 0x54, 0x37, 0xFF, 0x83, 0x57, 0x3C, 0xFF, 0x89, 0x5E, 0x44, 0xFF, 0x91, 0x68, + 0x4D, 0xFF, 0x97, 0x6F, 0x53, 0xFE, 0x9D, 0x77, 0x5C, 0xFD, 0xA2, 0x7D, 0x63, 0xF3, 0xA7, 0x83, + 0x67, 0xD5, 0xA7, 0x7D, 0x5A, 0xAD, 0x98, 0x63, 0x36, 0x8A, 0x85, 0x47, 0x10, 0x74, 0x81, 0x42, + 0x09, 0x67, 0x83, 0x44, 0x0B, 0x64, 0x84, 0x45, 0x0B, 0x62, 0x83, 0x44, 0x0C, 0x60, 0x83, 0x45, + 0x0C, 0x5A, 0x83, 0x46, 0x0D, 0x56, 0x83, 0x45, 0x0C, 0x50, 0x84, 0x45, 0x0D, 0x4A, 0x83, 0x45, + 0x0C, 0x43, 0x83, 0x45, 0x0C, 0x3D, 0x83, 0x45, 0x0C, 0x35, 0x83, 0x45, 0x0C, 0x2E, 0x83, 0x45, + 0x0C, 0x27, 0x83, 0x45, 0x0C, 0x20, 0x82, 0x45, 0x0C, 0x1A, 0x83, 0x45, 0x0C, 0x14, 0x82, 0x45, + 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0D, 0x08, 0x83, 0x45, 0x0C, 0x05, 0x82, 0x44, + 0x0A, 0x04, 0x81, 0x44, 0x0B, 0x03, 0x83, 0x48, 0x12, 0x01, 0x8C, 0x53, 0x1E, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x43, 0x09, 0x01, 0x81, 0x44, 0x0A, 0x01, 0x82, 0x45, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, + 0x0D, 0x09, 0x83, 0x45, 0x0D, 0x0C, 0x82, 0x45, 0x0D, 0x10, 0x83, 0x45, 0x0D, 0x14, 0x83, 0x45, + 0x0D, 0x19, 0x83, 0x45, 0x0C, 0x1E, 0x82, 0x45, 0x0C, 0x24, 0x84, 0x44, 0x0C, 0x29, 0x84, 0x46, + 0x0D, 0x2F, 0x84, 0x45, 0x0C, 0x34, 0x84, 0x45, 0x0B, 0x3A, 0x83, 0x44, 0x0B, 0x40, 0x7F, 0x40, + 0x05, 0x46, 0x85, 0x47, 0x0F, 0x52, 0x99, 0x69, 0x3E, 0x68, 0xAB, 0x81, 0x62, 0x98, 0xA3, 0x7A, + 0x5B, 0xD4, 0x97, 0x6D, 0x50, 0xF5, 0x8B, 0x60, 0x44, 0xFF, 0x81, 0x54, 0x37, 0xFF, 0x76, 0x46, + 0x29, 0xFF, 0x6F, 0x3E, 0x21, 0xFE, 0x69, 0x39, 0x1C, 0xFF, 0x67, 0x36, 0x18, 0xFF, 0x66, 0x35, + 0x18, 0xFF, 0x67, 0x35, 0x18, 0xFF, 0x67, 0x36, 0x18, 0xFF, 0x68, 0x37, 0x18, 0xFF, 0x69, 0x38, + 0x19, 0xFF, 0x6B, 0x39, 0x1A, 0xFF, 0x6C, 0x3A, 0x1B, 0xFF, 0x6E, 0x3C, 0x1C, 0xFF, 0x70, 0x3D, + 0x1D, 0xFF, 0x72, 0x3E, 0x1D, 0xFF, 0x73, 0x40, 0x1E, 0xFF, 0x74, 0x42, 0x1F, 0xFF, 0x75, 0x43, + 0x20, 0xFF, 0x76, 0x44, 0x21, 0xFF, 0x77, 0x45, 0x21, 0xFF, 0x78, 0x45, 0x22, 0xFF, 0x79, 0x47, + 0x23, 0xFF, 0x7A, 0x48, 0x24, 0xFF, 0x7B, 0x49, 0x24, 0xFF, 0x7C, 0x4A, 0x25, 0xFF, 0x7C, 0x4A, + 0x25, 0xFF, 0x7D, 0x4A, 0x25, 0xFF, 0x7E, 0x4B, 0x27, 0xFF, 0x7F, 0x4C, 0x27, 0xFF, 0x7F, 0x4D, + 0x28, 0xFF, 0x7F, 0x4D, 0x28, 0xFF, 0x7F, 0x4E, 0x29, 0xFF, 0x80, 0x4E, 0x29, 0xFF, 0x80, 0x4F, + 0x2A, 0xFF, 0x81, 0x4F, 0x2B, 0xFF, 0x80, 0x4F, 0x2B, 0xFF, 0x81, 0x4F, 0x2B, 0xFF, 0x81, 0x50, + 0x2C, 0xFF, 0x81, 0x50, 0x2D, 0xFF, 0x81, 0x50, 0x2D, 0xFF, 0x81, 0x50, 0x2D, 0xFF, 0x80, 0x51, + 0x2E, 0xFF, 0x80, 0x50, 0x2E, 0xFF, 0x80, 0x50, 0x2F, 0xFF, 0x7F, 0x4F, 0x2F, 0xFF, 0x7F, 0x4F, + 0x30, 0xFF, 0x7F, 0x4F, 0x30, 0xFF, 0x7F, 0x50, 0x31, 0xFF, 0x7F, 0x51, 0x32, 0xFF, 0x7F, 0x51, + 0x33, 0xFF, 0x7F, 0x52, 0x34, 0xFF, 0x80, 0x52, 0x35, 0xFF, 0x81, 0x55, 0x39, 0xFF, 0x85, 0x59, + 0x3E, 0xFF, 0x8B, 0x62, 0x46, 0xFF, 0x92, 0x6B, 0x4F, 0xFF, 0x9A, 0x73, 0x57, 0xFF, 0xA3, 0x7C, + 0x60, 0xFA, 0xA7, 0x81, 0x65, 0xE6, 0xAA, 0x86, 0x68, 0xBA, 0xA3, 0x76, 0x50, 0x8A, 0x8C, 0x52, + 0x1F, 0x67, 0x83, 0x43, 0x0A, 0x58, 0x82, 0x42, 0x0A, 0x53, 0x83, 0x45, 0x0B, 0x4F, 0x84, 0x46, + 0x0B, 0x4B, 0x83, 0x45, 0x0C, 0x48, 0x83, 0x45, 0x0D, 0x43, 0x83, 0x45, 0x0C, 0x3E, 0x83, 0x45, + 0x0D, 0x38, 0x83, 0x45, 0x0C, 0x31, 0x82, 0x45, 0x0C, 0x2C, 0x83, 0x45, 0x0C, 0x26, 0x83, 0x45, + 0x0C, 0x20, 0x83, 0x45, 0x0C, 0x1A, 0x82, 0x45, 0x0C, 0x15, 0x83, 0x45, 0x0C, 0x11, 0x82, 0x45, + 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x0A, 0x82, 0x45, 0x0C, 0x07, 0x83, 0x44, 0x0B, 0x05, 0x82, 0x44, + 0x0A, 0x03, 0x81, 0x44, 0x0D, 0x02, 0x8D, 0x55, 0x23, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x45, + 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x02, 0x83, 0x45, 0x0D, 0x04, 0x83, 0x45, 0x0D, 0x05, 0x82, 0x45, + 0x0D, 0x07, 0x82, 0x45, 0x0C, 0x0A, 0x82, 0x45, 0x0C, 0x0C, 0x82, 0x45, 0x0D, 0x10, 0x83, 0x45, + 0x0E, 0x13, 0x83, 0x45, 0x0E, 0x18, 0x82, 0x44, 0x0C, 0x1E, 0x82, 0x44, 0x0B, 0x21, 0x83, 0x44, + 0x0A, 0x24, 0x87, 0x46, 0x0D, 0x2A, 0x83, 0x41, 0x09, 0x31, 0x7C, 0x3D, 0x04, 0x35, 0x91, 0x57, + 0x24, 0x45, 0xAA, 0x80, 0x5C, 0x6A, 0xAC, 0x86, 0x69, 0xAA, 0x9E, 0x75, 0x57, 0xE5, 0x90, 0x66, + 0x48, 0xFC, 0x85, 0x59, 0x3B, 0xFF, 0x7D, 0x4D, 0x2F, 0xFF, 0x71, 0x3F, 0x21, 0xFF, 0x6B, 0x39, + 0x1B, 0xFF, 0x68, 0x36, 0x17, 0xFF, 0x66, 0x34, 0x15, 0xFF, 0x66, 0x34, 0x15, 0xFF, 0x67, 0x34, + 0x15, 0xFF, 0x69, 0x35, 0x16, 0xFF, 0x6A, 0x36, 0x16, 0xFF, 0x6B, 0x36, 0x17, 0xFF, 0x6C, 0x38, + 0x17, 0xFF, 0x6D, 0x39, 0x18, 0xFF, 0x6E, 0x3B, 0x19, 0xFF, 0x6F, 0x3C, 0x1A, 0xFF, 0x71, 0x3E, + 0x1B, 0xFF, 0x73, 0x3F, 0x1C, 0xFF, 0x74, 0x41, 0x1C, 0xFF, 0x76, 0x42, 0x1D, 0xFF, 0x77, 0x43, + 0x1E, 0xFF, 0x79, 0x45, 0x1F, 0xFF, 0x7A, 0x46, 0x21, 0xFF, 0x7B, 0x47, 0x21, 0xFF, 0x7C, 0x48, + 0x22, 0xFF, 0x7D, 0x49, 0x24, 0xFF, 0x7E, 0x4B, 0x25, 0xFF, 0x7F, 0x4C, 0x25, 0xFF, 0x7F, 0x4C, + 0x25, 0xFF, 0x80, 0x4D, 0x26, 0xFF, 0x80, 0x4D, 0x26, 0xFF, 0x81, 0x4D, 0x27, 0xFF, 0x81, 0x4E, + 0x28, 0xFF, 0x82, 0x4E, 0x28, 0xFF, 0x82, 0x4F, 0x29, 0xFF, 0x82, 0x4F, 0x29, 0xFF, 0x82, 0x50, + 0x2A, 0xFF, 0x83, 0x51, 0x2B, 0xFF, 0x83, 0x51, 0x2B, 0xFF, 0x84, 0x51, 0x2C, 0xFF, 0x83, 0x51, + 0x2C, 0xFF, 0x84, 0x51, 0x2D, 0xFF, 0x84, 0x51, 0x2D, 0xFF, 0x83, 0x51, 0x2E, 0xFF, 0x83, 0x52, + 0x2E, 0xFF, 0x82, 0x52, 0x2F, 0xFF, 0x82, 0x52, 0x2F, 0xFF, 0x82, 0x52, 0x2F, 0xFF, 0x81, 0x52, + 0x30, 0xFF, 0x81, 0x51, 0x30, 0xFF, 0x81, 0x51, 0x30, 0xFF, 0x81, 0x51, 0x31, 0xFF, 0x81, 0x51, + 0x31, 0xFF, 0x81, 0x51, 0x32, 0xFF, 0x81, 0x52, 0x33, 0xFF, 0x81, 0x52, 0x34, 0xFF, 0x82, 0x54, + 0x37, 0xFF, 0x84, 0x57, 0x3A, 0xFF, 0x88, 0x5D, 0x40, 0xFF, 0x8F, 0x66, 0x49, 0xFF, 0x98, 0x70, + 0x55, 0xFF, 0x9F, 0x78, 0x5C, 0xFE, 0xA5, 0x80, 0x63, 0xF2, 0xAC, 0x87, 0x6B, 0xCC, 0xAE, 0x87, + 0x66, 0x93, 0x9A, 0x66, 0x3A, 0x62, 0x86, 0x46, 0x0D, 0x47, 0x81, 0x3F, 0x05, 0x3F, 0x84, 0x44, + 0x0B, 0x3B, 0x84, 0x46, 0x0C, 0x38, 0x83, 0x45, 0x0C, 0x36, 0x83, 0x45, 0x0D, 0x32, 0x83, 0x45, + 0x0C, 0x2C, 0x84, 0x46, 0x0D, 0x27, 0x83, 0x45, 0x0C, 0x24, 0x82, 0x45, 0x0C, 0x1F, 0x83, 0x45, + 0x0C, 0x1A, 0x83, 0x45, 0x0C, 0x15, 0x82, 0x45, 0x0C, 0x11, 0x83, 0x45, 0x0C, 0x0D, 0x82, 0x45, + 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x08, 0x82, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x04, 0x82, 0x45, + 0x0C, 0x02, 0x85, 0x49, 0x12, 0x01, 0xA3, 0x71, 0x44, 0x01, 0x9F, 0x71, 0x4C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0D, 0x03, 0x83, 0x45, 0x0C, 0x04, 0x81, 0x44, + 0x0B, 0x05, 0x82, 0x45, 0x0C, 0x07, 0x82, 0x46, 0x0C, 0x09, 0x83, 0x46, 0x0C, 0x0C, 0x82, 0x45, + 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x11, 0x84, 0x46, 0x0C, 0x16, 0x84, 0x45, 0x0D, 0x19, 0x86, 0x47, + 0x09, 0x1D, 0x78, 0x37, 0x00, 0x21, 0x7E, 0x42, 0x07, 0x27, 0x9D, 0x6B, 0x3A, 0x3A, 0xB0, 0x8A, + 0x6A, 0x6E, 0xA7, 0x82, 0x67, 0xBC, 0x97, 0x6E, 0x51, 0xED, 0x88, 0x5C, 0x3E, 0xFD, 0x7C, 0x4E, + 0x30, 0xFF, 0x73, 0x42, 0x24, 0xFF, 0x68, 0x35, 0x16, 0xFF, 0x63, 0x2F, 0x10, 0xFF, 0x61, 0x2E, + 0x0F, 0xFF, 0x60, 0x2D, 0x0E, 0xFF, 0x61, 0x2D, 0x0D, 0xFF, 0x63, 0x2E, 0x0D, 0xFF, 0x65, 0x2F, + 0x0E, 0xFF, 0x66, 0x30, 0x0F, 0xFF, 0x68, 0x31, 0x10, 0xFF, 0x6A, 0x32, 0x10, 0xFF, 0x6B, 0x34, + 0x10, 0xFF, 0x6C, 0x36, 0x11, 0xFF, 0x6E, 0x37, 0x12, 0xFF, 0x6F, 0x39, 0x13, 0xFF, 0x71, 0x3B, + 0x14, 0xFF, 0x73, 0x3C, 0x16, 0xFF, 0x74, 0x3E, 0x17, 0xFF, 0x76, 0x3F, 0x18, 0xFF, 0x77, 0x41, + 0x18, 0xFF, 0x79, 0x42, 0x1A, 0xFF, 0x7A, 0x44, 0x1C, 0xFF, 0x7C, 0x46, 0x1E, 0xFF, 0x7C, 0x47, + 0x1E, 0xFF, 0x7D, 0x48, 0x20, 0xFF, 0x7E, 0x4A, 0x22, 0xFF, 0x80, 0x4B, 0x23, 0xFF, 0x80, 0x4D, + 0x24, 0xFF, 0x81, 0x4D, 0x24, 0xFF, 0x81, 0x4E, 0x25, 0xFF, 0x82, 0x4E, 0x26, 0xFF, 0x82, 0x4F, + 0x27, 0xFF, 0x84, 0x4F, 0x28, 0xFF, 0x84, 0x50, 0x29, 0xFF, 0x85, 0x51, 0x29, 0xFF, 0x85, 0x52, + 0x2A, 0xFF, 0x85, 0x52, 0x2A, 0xFF, 0x85, 0x53, 0x2B, 0xFF, 0x86, 0x53, 0x2B, 0xFF, 0x85, 0x53, + 0x2C, 0xFF, 0x86, 0x53, 0x2C, 0xFF, 0x86, 0x53, 0x2D, 0xFF, 0x86, 0x53, 0x2E, 0xFF, 0x85, 0x54, + 0x2E, 0xFF, 0x85, 0x54, 0x2F, 0xFF, 0x85, 0x54, 0x2F, 0xFF, 0x85, 0x54, 0x2F, 0xFF, 0x84, 0x54, + 0x2F, 0xFF, 0x84, 0x54, 0x30, 0xFF, 0x84, 0x53, 0x30, 0xFF, 0x84, 0x52, 0x30, 0xFF, 0x83, 0x52, + 0x31, 0xFF, 0x82, 0x52, 0x31, 0xFF, 0x82, 0x53, 0x32, 0xFF, 0x82, 0x52, 0x33, 0xFF, 0x81, 0x53, + 0x34, 0xFF, 0x82, 0x54, 0x35, 0xFF, 0x82, 0x55, 0x36, 0xFF, 0x84, 0x59, 0x3B, 0xFF, 0x8A, 0x60, + 0x44, 0xFF, 0x95, 0x6D, 0x51, 0xFF, 0x9F, 0x78, 0x5C, 0xFF, 0xA4, 0x7E, 0x62, 0xF7, 0xAB, 0x85, + 0x69, 0xDA, 0xB3, 0x8C, 0x6F, 0x9B, 0xA8, 0x7B, 0x57, 0x58, 0x89, 0x4E, 0x18, 0x39, 0x7A, 0x38, + 0x00, 0x30, 0x82, 0x41, 0x07, 0x2C, 0x84, 0x47, 0x0B, 0x28, 0x84, 0x46, 0x0D, 0x25, 0x83, 0x45, + 0x0C, 0x21, 0x83, 0x44, 0x0C, 0x20, 0x83, 0x45, 0x0C, 0x1C, 0x83, 0x45, 0x0C, 0x17, 0x82, 0x45, + 0x0C, 0x13, 0x83, 0x45, 0x0C, 0x10, 0x82, 0x45, 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x0B, 0x82, 0x45, + 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x06, 0x82, 0x44, 0x0B, 0x04, 0x83, 0x45, 0x0C, 0x03, 0x82, 0x45, + 0x0C, 0x01, 0x87, 0x49, 0x12, 0x01, 0x9B, 0x69, 0x3A, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x48, + 0x10, 0x01, 0x84, 0x47, 0x0F, 0x02, 0x83, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0A, 0x03, 0x81, 0x44, + 0x0A, 0x03, 0x81, 0x45, 0x0B, 0x04, 0x82, 0x46, 0x0B, 0x06, 0x82, 0x46, 0x0A, 0x08, 0x83, 0x47, + 0x0B, 0x0A, 0x84, 0x47, 0x0A, 0x0C, 0x7F, 0x3F, 0x08, 0x0E, 0x80, 0x3F, 0x04, 0x12, 0x77, 0x36, + 0x00, 0x17, 0x8C, 0x52, 0x1C, 0x1B, 0xB2, 0x89, 0x63, 0x37, 0xB0, 0x8C, 0x6F, 0x79, 0x9F, 0x78, + 0x5D, 0xCB, 0x96, 0x6A, 0x4C, 0xF3, 0x86, 0x58, 0x38, 0xFD, 0x75, 0x45, 0x25, 0xFF, 0x6B, 0x38, + 0x18, 0xFF, 0x63, 0x2E, 0x0D, 0xFF, 0x61, 0x2A, 0x0A, 0xFF, 0x61, 0x2A, 0x09, 0xFF, 0x5F, 0x29, + 0x08, 0xFF, 0x60, 0x2A, 0x07, 0xFF, 0x61, 0x2A, 0x07, 0xFF, 0x63, 0x2A, 0x07, 0xFF, 0x64, 0x2B, + 0x08, 0xFF, 0x65, 0x2C, 0x08, 0xFF, 0x67, 0x2E, 0x09, 0xFF, 0x68, 0x2F, 0x09, 0xFF, 0x6A, 0x31, + 0x09, 0xFF, 0x6B, 0x32, 0x09, 0xFF, 0x6C, 0x33, 0x0A, 0xFF, 0x6D, 0x34, 0x0B, 0xFF, 0x6F, 0x35, + 0x0B, 0xFF, 0x70, 0x36, 0x0C, 0xFF, 0x71, 0x37, 0x0D, 0xFF, 0x72, 0x38, 0x0D, 0xFF, 0x74, 0x3A, + 0x0E, 0xFF, 0x75, 0x3B, 0x0E, 0xFF, 0x76, 0x3C, 0x10, 0xFF, 0x77, 0x3D, 0x11, 0xFF, 0x78, 0x40, + 0x13, 0xFF, 0x7A, 0x41, 0x16, 0xFF, 0x7B, 0x43, 0x18, 0xFF, 0x7D, 0x45, 0x1B, 0xFF, 0x7F, 0x48, + 0x1D, 0xFF, 0x81, 0x4B, 0x20, 0xFF, 0x81, 0x4D, 0x21, 0xFF, 0x83, 0x4E, 0x24, 0xFF, 0x83, 0x4F, + 0x25, 0xFF, 0x85, 0x51, 0x27, 0xFF, 0x86, 0x52, 0x28, 0xFF, 0x88, 0x53, 0x29, 0xFF, 0x87, 0x53, + 0x2A, 0xFF, 0x88, 0x53, 0x2A, 0xFF, 0x88, 0x54, 0x2A, 0xFF, 0x88, 0x54, 0x2B, 0xFF, 0x88, 0x55, + 0x2B, 0xFF, 0x88, 0x55, 0x2C, 0xFF, 0x88, 0x55, 0x2C, 0xFF, 0x88, 0x55, 0x2D, 0xFF, 0x88, 0x55, + 0x2D, 0xFF, 0x88, 0x55, 0x2E, 0xFF, 0x88, 0x55, 0x2E, 0xFF, 0x88, 0x55, 0x2F, 0xFF, 0x88, 0x55, + 0x2F, 0xFF, 0x87, 0x55, 0x30, 0xFF, 0x87, 0x55, 0x30, 0xFF, 0x86, 0x55, 0x31, 0xFF, 0x86, 0x55, + 0x31, 0xFF, 0x85, 0x54, 0x31, 0xFF, 0x84, 0x54, 0x31, 0xFF, 0x83, 0x54, 0x32, 0xFF, 0x83, 0x53, + 0x32, 0xFF, 0x82, 0x53, 0x33, 0xFF, 0x83, 0x54, 0x34, 0xFF, 0x83, 0x54, 0x35, 0xFF, 0x84, 0x56, + 0x39, 0xFF, 0x89, 0x5D, 0x40, 0xFF, 0x92, 0x68, 0x4B, 0xFF, 0x9A, 0x72, 0x56, 0xFF, 0xA2, 0x7C, + 0x62, 0xFC, 0xA8, 0x83, 0x68, 0xE5, 0xAF, 0x8D, 0x71, 0xA5, 0xB5, 0x90, 0x6F, 0x54, 0x98, 0x64, + 0x37, 0x31, 0x76, 0x35, 0x00, 0x24, 0x7E, 0x3F, 0x00, 0x1C, 0x85, 0x47, 0x0B, 0x19, 0x84, 0x47, + 0x0E, 0x19, 0x84, 0x45, 0x0D, 0x18, 0x84, 0x45, 0x0C, 0x14, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, + 0x0D, 0x0E, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x07, 0x82, 0x45, + 0x0C, 0x06, 0x82, 0x44, 0x0B, 0x04, 0x81, 0x43, 0x0B, 0x02, 0x81, 0x44, 0x0B, 0x02, 0x83, 0x45, + 0x0D, 0x01, 0x84, 0x48, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x85, 0x49, 0x11, 0x01, 0x83, 0x46, 0x0C, 0x01, 0x83, 0x44, 0x0C, 0x02, 0x83, 0x45, + 0x0C, 0x02, 0x83, 0x46, 0x0D, 0x03, 0x83, 0x48, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, + 0x0E, 0x06, 0x86, 0x41, 0x0F, 0x08, 0x7C, 0x38, 0x04, 0x0B, 0x73, 0x33, 0x00, 0x0F, 0xA3, 0x6F, + 0x41, 0x13, 0xCA, 0xA5, 0x8A, 0x30, 0xAB, 0x84, 0x68, 0x7E, 0x99, 0x70, 0x54, 0xD5, 0x8F, 0x65, + 0x46, 0xF8, 0x83, 0x55, 0x35, 0xFF, 0x6F, 0x3D, 0x1C, 0xFF, 0x65, 0x30, 0x0F, 0xFF, 0x5F, 0x29, + 0x09, 0xFF, 0x5E, 0x27, 0x06, 0xFF, 0x5E, 0x27, 0x06, 0xFF, 0x60, 0x28, 0x06, 0xFF, 0x60, 0x29, + 0x06, 0xFF, 0x62, 0x2A, 0x05, 0xFF, 0x63, 0x2B, 0x06, 0xFF, 0x65, 0x2B, 0x05, 0xFF, 0x66, 0x2C, + 0x05, 0xFF, 0x67, 0x2D, 0x06, 0xFF, 0x68, 0x2E, 0x06, 0xFF, 0x6A, 0x2F, 0x06, 0xFF, 0x6B, 0x31, + 0x07, 0xFF, 0x6D, 0x32, 0x07, 0xFF, 0x6D, 0x33, 0x07, 0xFF, 0x6F, 0x34, 0x08, 0xFF, 0x70, 0x35, + 0x08, 0xFF, 0x71, 0x36, 0x08, 0xFF, 0x72, 0x37, 0x09, 0xFF, 0x73, 0x38, 0x09, 0xFF, 0x74, 0x39, + 0x09, 0xFF, 0x76, 0x39, 0x0A, 0xFF, 0x76, 0x3A, 0x0A, 0xFF, 0x77, 0x3A, 0x0A, 0xFF, 0x77, 0x3B, + 0x09, 0xFF, 0x78, 0x3B, 0x0A, 0xFF, 0x79, 0x3C, 0x0A, 0xFF, 0x7A, 0x3E, 0x0C, 0xFF, 0x7B, 0x3F, + 0x0D, 0xFF, 0x7D, 0x41, 0x10, 0xFF, 0x7E, 0x43, 0x12, 0xFF, 0x80, 0x45, 0x15, 0xFF, 0x82, 0x49, + 0x19, 0xFF, 0x84, 0x4C, 0x1D, 0xFF, 0x85, 0x4F, 0x20, 0xFF, 0x87, 0x51, 0x24, 0xFF, 0x88, 0x53, + 0x27, 0xFF, 0x89, 0x53, 0x28, 0xFF, 0x89, 0x54, 0x29, 0xFF, 0x8A, 0x55, 0x2A, 0xFF, 0x89, 0x56, + 0x2A, 0xFF, 0x8A, 0x56, 0x2B, 0xFF, 0x8A, 0x57, 0x2B, 0xFF, 0x8B, 0x57, 0x2C, 0xFF, 0x8B, 0x57, + 0x2D, 0xFF, 0x8B, 0x57, 0x2D, 0xFF, 0x8A, 0x57, 0x2E, 0xFF, 0x8A, 0x57, 0x2E, 0xFF, 0x8A, 0x57, + 0x2F, 0xFF, 0x8A, 0x57, 0x30, 0xFF, 0x89, 0x57, 0x30, 0xFF, 0x89, 0x57, 0x30, 0xFF, 0x88, 0x57, + 0x30, 0xFF, 0x88, 0x57, 0x30, 0xFF, 0x86, 0x56, 0x31, 0xFF, 0x86, 0x55, 0x31, 0xFF, 0x85, 0x55, + 0x32, 0xFF, 0x85, 0x54, 0x32, 0xFF, 0x84, 0x55, 0x33, 0xFF, 0x84, 0x55, 0x33, 0xFF, 0x84, 0x54, + 0x34, 0xFF, 0x85, 0x56, 0x37, 0xFF, 0x87, 0x5A, 0x3B, 0xFF, 0x8E, 0x63, 0x45, 0xFF, 0x97, 0x70, + 0x54, 0xFF, 0xA2, 0x7C, 0x60, 0xFD, 0xA8, 0x83, 0x66, 0xEF, 0xAD, 0x8B, 0x6E, 0xB1, 0xBC, 0x9B, + 0x7E, 0x51, 0xAB, 0x7F, 0x57, 0x27, 0x76, 0x35, 0x00, 0x18, 0x7D, 0x37, 0x00, 0x14, 0x85, 0x43, + 0x0D, 0x13, 0x83, 0x43, 0x0C, 0x10, 0x83, 0x46, 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, + 0x0D, 0x0B, 0x83, 0x45, 0x0C, 0x09, 0x82, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x05, 0x82, 0x45, + 0x0C, 0x04, 0x82, 0x45, 0x0C, 0x02, 0x81, 0x44, 0x0B, 0x01, 0x82, 0x44, 0x0C, 0x01, 0x83, 0x45, + 0x0D, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x4A, 0x12, 0x01, 0x84, 0x46, + 0x0E, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x86, 0x4A, 0x0F, 0x02, 0x85, 0x47, 0x14, 0x02, 0x69, 0x1E, + 0x00, 0x03, 0x62, 0x12, 0x00, 0x06, 0x78, 0x32, 0x0B, 0x09, 0xC0, 0x99, 0x6C, 0x0F, 0xD8, 0xB4, + 0x9C, 0x30, 0xA9, 0x83, 0x65, 0x88, 0x93, 0x6A, 0x4E, 0xDD, 0x90, 0x64, 0x44, 0xF8, 0x81, 0x52, + 0x31, 0xFE, 0x6C, 0x39, 0x17, 0xFF, 0x64, 0x2E, 0x0C, 0xFF, 0x62, 0x2A, 0x08, 0xFF, 0x5F, 0x27, + 0x05, 0xFF, 0x60, 0x28, 0x04, 0xFF, 0x61, 0x29, 0x05, 0xFF, 0x62, 0x29, 0x05, 0xFF, 0x63, 0x2B, + 0x06, 0xFF, 0x65, 0x2C, 0x05, 0xFF, 0x67, 0x2E, 0x05, 0xFF, 0x68, 0x2F, 0x06, 0xFF, 0x6A, 0x30, + 0x06, 0xFF, 0x6C, 0x32, 0x07, 0xFF, 0x6D, 0x32, 0x06, 0xFF, 0x6E, 0x33, 0x06, 0xFF, 0x6F, 0x34, + 0x07, 0xFF, 0x71, 0x35, 0x07, 0xFF, 0x72, 0x36, 0x07, 0xFF, 0x73, 0x37, 0x07, 0xFF, 0x74, 0x38, + 0x07, 0xFF, 0x75, 0x39, 0x08, 0xFF, 0x76, 0x3A, 0x08, 0xFF, 0x77, 0x3A, 0x09, 0xFF, 0x77, 0x3A, + 0x09, 0xFF, 0x78, 0x3B, 0x09, 0xFF, 0x79, 0x3C, 0x09, 0xFF, 0x79, 0x3C, 0x09, 0xFF, 0x7A, 0x3C, + 0x09, 0xFF, 0x7B, 0x3D, 0x09, 0xFF, 0x7B, 0x3E, 0x0A, 0xFF, 0x7C, 0x3E, 0x0A, 0xFF, 0x7C, 0x3E, + 0x0A, 0xFF, 0x7C, 0x3E, 0x0A, 0xFF, 0x7C, 0x3F, 0x0B, 0xFF, 0x7D, 0x3F, 0x0C, 0xFF, 0x7D, 0x40, + 0x0D, 0xFF, 0x7D, 0x41, 0x0E, 0xFF, 0x7E, 0x43, 0x11, 0xFF, 0x7F, 0x46, 0x14, 0xFF, 0x82, 0x49, + 0x19, 0xFF, 0x85, 0x4D, 0x1E, 0xFF, 0x87, 0x51, 0x22, 0xFF, 0x8A, 0x55, 0x26, 0xFF, 0x8B, 0x56, + 0x28, 0xFF, 0x8C, 0x58, 0x2A, 0xFF, 0x8D, 0x58, 0x2B, 0xFF, 0x8D, 0x58, 0x2B, 0xFF, 0x8C, 0x58, + 0x2C, 0xFF, 0x8C, 0x58, 0x2C, 0xFF, 0x8C, 0x59, 0x2D, 0xFF, 0x8C, 0x58, 0x2D, 0xFF, 0x8C, 0x58, + 0x2E, 0xFF, 0x8B, 0x58, 0x2E, 0xFF, 0x8B, 0x58, 0x2F, 0xFF, 0x8B, 0x58, 0x2F, 0xFF, 0x8B, 0x58, + 0x2F, 0xFF, 0x8A, 0x58, 0x30, 0xFF, 0x8A, 0x58, 0x30, 0xFF, 0x89, 0x57, 0x31, 0xFF, 0x88, 0x57, + 0x31, 0xFF, 0x87, 0x57, 0x31, 0xFF, 0x87, 0x56, 0x31, 0xFF, 0x86, 0x56, 0x32, 0xFF, 0x85, 0x55, + 0x32, 0xFF, 0x85, 0x55, 0x33, 0xFF, 0x85, 0x56, 0x35, 0xFF, 0x87, 0x59, 0x38, 0xFF, 0x8C, 0x61, + 0x43, 0xFF, 0x97, 0x6E, 0x51, 0xFF, 0xA4, 0x7E, 0x61, 0xFF, 0xAA, 0x85, 0x66, 0xF5, 0xAD, 0x8A, + 0x6D, 0xB7, 0xC1, 0xA2, 0x85, 0x52, 0xBA, 0x98, 0x76, 0x24, 0x7D, 0x3F, 0x18, 0x11, 0x6A, 0x22, + 0x00, 0x0E, 0x73, 0x2E, 0x00, 0x0A, 0x83, 0x48, 0x0F, 0x08, 0x85, 0x47, 0x0E, 0x07, 0x83, 0x44, + 0x0C, 0x06, 0x84, 0x45, 0x0D, 0x05, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x83, 0x46, 0x0E, 0x01, 0x84, 0x46, 0x0E, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x46, + 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3D, 0x12, 0x01, 0x58, 0x04, + 0x00, 0x02, 0x5D, 0x0E, 0x03, 0x05, 0xC3, 0xA4, 0x85, 0x0A, 0xDF, 0xC6, 0xAC, 0x2D, 0xA1, 0x7A, + 0x5D, 0x88, 0x8D, 0x66, 0x4C, 0xDF, 0x92, 0x66, 0x45, 0xFB, 0x82, 0x51, 0x2E, 0xFF, 0x68, 0x34, + 0x12, 0xFF, 0x61, 0x2B, 0x09, 0xFF, 0x5F, 0x28, 0x06, 0xFF, 0x60, 0x27, 0x06, 0xFF, 0x60, 0x28, + 0x05, 0xFF, 0x62, 0x29, 0x04, 0xFF, 0x63, 0x2A, 0x05, 0xFF, 0x65, 0x2B, 0x05, 0xFF, 0x66, 0x2D, + 0x06, 0xFF, 0x68, 0x2F, 0x06, 0xFF, 0x69, 0x30, 0x06, 0xFF, 0x6B, 0x31, 0x06, 0xFF, 0x6B, 0x32, + 0x06, 0xFF, 0x6D, 0x33, 0x07, 0xFF, 0x6E, 0x34, 0x07, 0xFF, 0x71, 0x35, 0x07, 0xFF, 0x72, 0x36, + 0x07, 0xFF, 0x74, 0x38, 0x08, 0xFF, 0x75, 0x39, 0x08, 0xFF, 0x76, 0x3A, 0x08, 0xFF, 0x77, 0x3B, + 0x08, 0xFF, 0x78, 0x3C, 0x08, 0xFF, 0x79, 0x3C, 0x09, 0xFF, 0x7A, 0x3D, 0x09, 0xFF, 0x7A, 0x3D, + 0x09, 0xFF, 0x7A, 0x3D, 0x09, 0xFF, 0x7B, 0x3E, 0x09, 0xFF, 0x7C, 0x3E, 0x0A, 0xFF, 0x7B, 0x3E, + 0x09, 0xFF, 0x7C, 0x3F, 0x0A, 0xFF, 0x7D, 0x3F, 0x0A, 0xFF, 0x7D, 0x40, 0x0A, 0xFF, 0x7D, 0x40, + 0x0A, 0xFF, 0x7E, 0x40, 0x0A, 0xFF, 0x7E, 0x40, 0x0B, 0xFF, 0x7F, 0x41, 0x0B, 0xFF, 0x7F, 0x41, + 0x0C, 0xFF, 0x80, 0x41, 0x0C, 0xFF, 0x80, 0x41, 0x0B, 0xFF, 0x80, 0x41, 0x0C, 0xFF, 0x80, 0x41, + 0x0B, 0xFF, 0x80, 0x42, 0x0D, 0xFF, 0x81, 0x45, 0x10, 0xFF, 0x83, 0x48, 0x14, 0xFF, 0x87, 0x4E, + 0x1A, 0xFF, 0x89, 0x52, 0x20, 0xFF, 0x8B, 0x55, 0x25, 0xFF, 0x8D, 0x57, 0x29, 0xFF, 0x8D, 0x58, + 0x2A, 0xFF, 0x8D, 0x59, 0x2B, 0xFF, 0x8D, 0x5A, 0x2C, 0xFF, 0x8E, 0x5A, 0x2D, 0xFF, 0x8D, 0x5A, + 0x2D, 0xFF, 0x8D, 0x5A, 0x2D, 0xFF, 0x8D, 0x5A, 0x2E, 0xFF, 0x8D, 0x5A, 0x2E, 0xFF, 0x8D, 0x5A, + 0x2F, 0xFF, 0x8D, 0x59, 0x2F, 0xFF, 0x8C, 0x59, 0x30, 0xFF, 0x8C, 0x59, 0x31, 0xFF, 0x8A, 0x59, + 0x31, 0xFF, 0x89, 0x58, 0x31, 0xFF, 0x89, 0x58, 0x31, 0xFF, 0x88, 0x57, 0x31, 0xFF, 0x87, 0x57, + 0x32, 0xFF, 0x87, 0x56, 0x32, 0xFF, 0x86, 0x56, 0x33, 0xFF, 0x86, 0x57, 0x34, 0xFF, 0x86, 0x58, + 0x37, 0xFF, 0x8A, 0x5E, 0x3F, 0xFF, 0x95, 0x6B, 0x4E, 0xFF, 0xA3, 0x7D, 0x5F, 0xFF, 0xAB, 0x86, + 0x6A, 0xF9, 0xB2, 0x91, 0x76, 0xBA, 0xC2, 0xA6, 0x89, 0x52, 0xC5, 0xA1, 0x82, 0x1D, 0x75, 0x33, + 0x0D, 0x0B, 0x6A, 0x1B, 0x00, 0x08, 0x7E, 0x3E, 0x09, 0x05, 0x83, 0x46, 0x0C, 0x04, 0x83, 0x45, + 0x0B, 0x03, 0x83, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x5B, + 0x40, 0x01, 0xCF, 0xB4, 0x99, 0x06, 0xD5, 0xB9, 0x9F, 0x29, 0xAB, 0x83, 0x62, 0x88, 0x93, 0x69, + 0x48, 0xE1, 0x94, 0x69, 0x45, 0xFB, 0x81, 0x50, 0x2E, 0xFE, 0x6A, 0x34, 0x11, 0xFF, 0x61, 0x29, + 0x06, 0xFF, 0x62, 0x29, 0x06, 0xFF, 0x61, 0x28, 0x05, 0xFF, 0x61, 0x29, 0x05, 0xFF, 0x63, 0x2A, + 0x06, 0xFF, 0x65, 0x2C, 0x05, 0xFF, 0x67, 0x2D, 0x06, 0xFF, 0x68, 0x2E, 0x06, 0xFF, 0x6A, 0x31, + 0x06, 0xFF, 0x6B, 0x32, 0x07, 0xFF, 0x6B, 0x32, 0x07, 0xFF, 0x6B, 0x33, 0x08, 0xFF, 0x6C, 0x34, + 0x08, 0xFF, 0x6E, 0x35, 0x08, 0xFF, 0x70, 0x36, 0x08, 0xFF, 0x73, 0x38, 0x09, 0xFF, 0x75, 0x39, + 0x08, 0xFF, 0x77, 0x3B, 0x09, 0xFF, 0x78, 0x3B, 0x09, 0xFF, 0x79, 0x3D, 0x0A, 0xFF, 0x7A, 0x3E, + 0x0A, 0xFF, 0x7B, 0x3E, 0x0A, 0xFF, 0x7C, 0x3F, 0x0A, 0xFF, 0x7D, 0x3F, 0x0A, 0xFF, 0x7D, 0x40, + 0x0A, 0xFF, 0x7E, 0x40, 0x0A, 0xFF, 0x7E, 0x40, 0x0A, 0xFF, 0x7E, 0x40, 0x0A, 0xFF, 0x7F, 0x41, + 0x0A, 0xFF, 0x7F, 0x41, 0x0B, 0xFF, 0x7F, 0x41, 0x0B, 0xFF, 0x80, 0x41, 0x0B, 0xFF, 0x80, 0x42, + 0x0B, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x81, 0x42, + 0x0B, 0xFF, 0x81, 0x42, 0x0A, 0xFF, 0x81, 0x43, 0x0A, 0xFF, 0x82, 0x43, 0x0A, 0xFF, 0x82, 0x43, + 0x0B, 0xFF, 0x82, 0x43, 0x0B, 0xFF, 0x81, 0x43, 0x0C, 0xFF, 0x81, 0x43, 0x0C, 0xFF, 0x81, 0x44, + 0x0D, 0xFF, 0x81, 0x45, 0x0F, 0xFF, 0x83, 0x48, 0x14, 0xFF, 0x86, 0x4D, 0x1A, 0xFF, 0x88, 0x51, + 0x20, 0xFF, 0x8C, 0x56, 0x27, 0xFF, 0x8E, 0x59, 0x2A, 0xFF, 0x8F, 0x5B, 0x2C, 0xFF, 0x8F, 0x5B, + 0x2D, 0xFF, 0x90, 0x5B, 0x2D, 0xFF, 0x8F, 0x5B, 0x2E, 0xFF, 0x8F, 0x5B, 0x2E, 0xFF, 0x8E, 0x5B, + 0x2F, 0xFF, 0x8E, 0x5B, 0x2F, 0xFF, 0x8E, 0x5B, 0x30, 0xFF, 0x8D, 0x5A, 0x30, 0xFF, 0x8D, 0x5A, + 0x31, 0xFF, 0x8C, 0x5A, 0x31, 0xFF, 0x8B, 0x5A, 0x31, 0xFF, 0x8A, 0x59, 0x31, 0xFF, 0x8A, 0x58, + 0x32, 0xFF, 0x89, 0x58, 0x32, 0xFF, 0x87, 0x57, 0x32, 0xFF, 0x87, 0x57, 0x33, 0xFF, 0x87, 0x57, + 0x34, 0xFF, 0x87, 0x58, 0x35, 0xFF, 0x8A, 0x5D, 0x3E, 0xFF, 0x96, 0x6C, 0x4C, 0xFF, 0xA3, 0x7C, + 0x5C, 0xFF, 0xA8, 0x83, 0x68, 0xF8, 0xB1, 0x90, 0x77, 0xB8, 0xBE, 0xA1, 0x88, 0x51, 0xC3, 0xA6, + 0x8A, 0x18, 0x9F, 0x6D, 0x4F, 0x04, 0x90, 0x4A, 0x1E, 0x03, 0x79, 0x39, 0x04, 0x01, 0x7C, 0x3F, + 0x08, 0x01, 0x84, 0x48, 0x0F, 0x02, 0x81, 0x45, 0x0D, 0x02, 0x83, 0x46, 0x0F, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0xD6, + 0xBF, 0x01, 0xDB, 0xBF, 0xA6, 0x25, 0xA8, 0x81, 0x63, 0x80, 0x96, 0x6D, 0x4E, 0xDE, 0x91, 0x65, + 0x43, 0xFC, 0x80, 0x4E, 0x2A, 0xFF, 0x69, 0x34, 0x11, 0xFF, 0x62, 0x2B, 0x07, 0xFF, 0x61, 0x29, + 0x05, 0xFF, 0x62, 0x29, 0x06, 0xFF, 0x62, 0x2A, 0x05, 0xFF, 0x63, 0x2A, 0x05, 0xFF, 0x65, 0x2D, + 0x06, 0xFF, 0x69, 0x2F, 0x07, 0xFF, 0x69, 0x2F, 0x07, 0xFF, 0x6B, 0x31, 0x07, 0xFF, 0x6B, 0x32, + 0x07, 0xFF, 0x6C, 0x33, 0x07, 0xFF, 0x6B, 0x34, 0x08, 0xFF, 0x6C, 0x34, 0x08, 0xFF, 0x6D, 0x36, + 0x09, 0xFF, 0x6F, 0x36, 0x08, 0xFF, 0x70, 0x38, 0x08, 0xFF, 0x73, 0x39, 0x09, 0xFF, 0x76, 0x3B, + 0x09, 0xFF, 0x78, 0x3C, 0x0A, 0xFF, 0x79, 0x3D, 0x0A, 0xFF, 0x7B, 0x3E, 0x0A, 0xFF, 0x7C, 0x3F, + 0x0A, 0xFF, 0x7E, 0x40, 0x0A, 0xFF, 0x7E, 0x41, 0x0A, 0xFF, 0x7F, 0x41, 0x0A, 0xFF, 0x80, 0x42, + 0x0A, 0xFF, 0x80, 0x42, 0x0A, 0xFF, 0x80, 0x42, 0x0A, 0xFF, 0x81, 0x42, 0x0A, 0xFF, 0x81, 0x43, + 0x0B, 0xFF, 0x81, 0x43, 0x0B, 0xFF, 0x81, 0x43, 0x0B, 0xFF, 0x82, 0x43, 0x0B, 0xFF, 0x82, 0x44, + 0x0B, 0xFF, 0x83, 0x44, 0x0B, 0xFF, 0x83, 0x44, 0x0B, 0xFF, 0x83, 0x44, 0x0B, 0xFF, 0x82, 0x44, + 0x0B, 0xFF, 0x83, 0x44, 0x0B, 0xFF, 0x82, 0x44, 0x0B, 0xFF, 0x83, 0x44, 0x0B, 0xFF, 0x83, 0x44, + 0x0B, 0xFF, 0x83, 0x44, 0x0C, 0xFF, 0x83, 0x44, 0x0C, 0xFF, 0x84, 0x45, 0x0D, 0xFF, 0x83, 0x45, + 0x0D, 0xFF, 0x84, 0x44, 0x0D, 0xFF, 0x84, 0x44, 0x0C, 0xFF, 0x85, 0x45, 0x0D, 0xFF, 0x85, 0x46, + 0x0F, 0xFF, 0x86, 0x48, 0x12, 0xFF, 0x89, 0x4E, 0x19, 0xFF, 0x8C, 0x54, 0x21, 0xFF, 0x8E, 0x58, + 0x27, 0xFF, 0x90, 0x5A, 0x2B, 0xFF, 0x90, 0x5C, 0x2D, 0xFF, 0x90, 0x5B, 0x2E, 0xFF, 0x90, 0x5C, + 0x2E, 0xFF, 0x90, 0x5C, 0x2F, 0xFF, 0x90, 0x5C, 0x30, 0xFF, 0x8F, 0x5C, 0x30, 0xFF, 0x8F, 0x5C, + 0x30, 0xFF, 0x8E, 0x5B, 0x30, 0xFF, 0x8D, 0x5B, 0x31, 0xFF, 0x8C, 0x5A, 0x32, 0xFF, 0x8C, 0x5A, + 0x32, 0xFF, 0x8B, 0x59, 0x32, 0xFF, 0x89, 0x58, 0x32, 0xFF, 0x88, 0x58, 0x32, 0xFF, 0x88, 0x57, + 0x33, 0xFF, 0x88, 0x58, 0x33, 0xFF, 0x88, 0x59, 0x36, 0xFF, 0x8B, 0x5D, 0x3C, 0xFF, 0x96, 0x6C, + 0x4B, 0xFF, 0xA3, 0x7D, 0x5F, 0xFF, 0xA9, 0x86, 0x6A, 0xF7, 0xB3, 0x92, 0x76, 0xAE, 0xBB, 0x9D, + 0x81, 0x49, 0xC8, 0xAA, 0x8F, 0x12, 0xC0, 0xA2, 0x86, 0x01, 0xA7, 0x74, 0x46, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x49, 0x14, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xC2, + 0xB3, 0x1F, 0xB1, 0x86, 0x69, 0x79, 0x99, 0x6D, 0x4A, 0xD9, 0x92, 0x65, 0x43, 0xFB, 0x7F, 0x4D, + 0x29, 0xFF, 0x6B, 0x34, 0x10, 0xFF, 0x63, 0x2B, 0x07, 0xFF, 0x63, 0x2B, 0x06, 0xFF, 0x64, 0x2B, + 0x06, 0xFF, 0x65, 0x2B, 0x06, 0xFF, 0x65, 0x2C, 0x07, 0xFF, 0x67, 0x2D, 0x07, 0xFF, 0x6A, 0x30, + 0x07, 0xFF, 0x6B, 0x32, 0x07, 0xFF, 0x6B, 0x32, 0x08, 0xFF, 0x6C, 0x33, 0x07, 0xFF, 0x6D, 0x34, + 0x08, 0xFF, 0x6D, 0x36, 0x09, 0xFF, 0x6D, 0x37, 0x09, 0xFF, 0x69, 0x35, 0x08, 0xFF, 0x68, 0x35, + 0x08, 0xFF, 0x6B, 0x38, 0x09, 0xFF, 0x6C, 0x37, 0x07, 0xFF, 0x6F, 0x39, 0x08, 0xFF, 0x74, 0x3B, + 0x0A, 0xFF, 0x77, 0x3D, 0x0B, 0xFF, 0x7B, 0x3E, 0x0B, 0xFF, 0x7E, 0x40, 0x0C, 0xFF, 0x80, 0x41, + 0x0B, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x81, 0x43, 0x0B, 0xFF, 0x82, 0x43, 0x0B, 0xFF, 0x82, 0x43, + 0x0B, 0xFF, 0x82, 0x43, 0x0B, 0xFF, 0x83, 0x44, 0x0B, 0xFF, 0x83, 0x44, 0x0B, 0xFF, 0x83, 0x44, + 0x0C, 0xFF, 0x83, 0x44, 0x0C, 0xFF, 0x83, 0x45, 0x0C, 0xFF, 0x84, 0x45, 0x0C, 0xFF, 0x84, 0x45, + 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, + 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, + 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x46, 0x0C, 0xFF, 0x85, 0x46, + 0x0D, 0xFF, 0x85, 0x46, 0x0C, 0xFF, 0x84, 0x46, 0x0C, 0xFF, 0x85, 0x46, 0x0C, 0xFF, 0x85, 0x46, + 0x0C, 0xFF, 0x85, 0x46, 0x0D, 0xFF, 0x84, 0x46, 0x0D, 0xFF, 0x84, 0x47, 0x10, 0xFF, 0x86, 0x4B, + 0x16, 0xFF, 0x8A, 0x52, 0x1F, 0xFF, 0x8E, 0x57, 0x25, 0xFF, 0x91, 0x5B, 0x2B, 0xFF, 0x92, 0x5D, + 0x2E, 0xFF, 0x92, 0x5D, 0x2E, 0xFF, 0x91, 0x5D, 0x2F, 0xFF, 0x91, 0x5D, 0x2F, 0xFF, 0x91, 0x5D, + 0x30, 0xFF, 0x90, 0x5C, 0x30, 0xFF, 0x8F, 0x5C, 0x31, 0xFF, 0x8F, 0x5C, 0x31, 0xFF, 0x8E, 0x5B, + 0x31, 0xFF, 0x8D, 0x5B, 0x32, 0xFF, 0x8C, 0x5A, 0x32, 0xFF, 0x8B, 0x59, 0x32, 0xFF, 0x8A, 0x58, + 0x32, 0xFF, 0x89, 0x57, 0x32, 0xFF, 0x89, 0x58, 0x33, 0xFF, 0x89, 0x59, 0x35, 0xFF, 0x8C, 0x5D, + 0x3C, 0xFF, 0x97, 0x6C, 0x4C, 0xFF, 0xA5, 0x7F, 0x62, 0xFF, 0xAB, 0x87, 0x69, 0xF2, 0xB7, 0x96, + 0x7A, 0xA7, 0xC2, 0xA4, 0x8A, 0x46, 0xCA, 0xAF, 0x95, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0xC7, 0xB8, 0x1B, 0xAD, 0x89, + 0x6B, 0x6E, 0x9A, 0x70, 0x4C, 0xD2, 0x93, 0x67, 0x45, 0xFA, 0x7F, 0x4E, 0x2B, 0xFF, 0x6C, 0x35, + 0x12, 0xFF, 0x64, 0x2C, 0x08, 0xFF, 0x63, 0x2A, 0x05, 0xFF, 0x65, 0x2B, 0x06, 0xFF, 0x65, 0x2C, + 0x06, 0xFF, 0x67, 0x2D, 0x06, 0xFF, 0x68, 0x2E, 0x07, 0xFF, 0x6B, 0x30, 0x07, 0xFF, 0x6D, 0x33, + 0x07, 0xFF, 0x6D, 0x33, 0x07, 0xFF, 0x6D, 0x34, 0x07, 0xFF, 0x6D, 0x34, 0x08, 0xFF, 0x6D, 0x35, + 0x08, 0xFF, 0x6C, 0x35, 0x08, 0xFF, 0x6A, 0x36, 0x09, 0xFF, 0x69, 0x39, 0x0D, 0xFF, 0x6A, 0x3D, + 0x12, 0xFF, 0x64, 0x36, 0x0C, 0xFF, 0x63, 0x35, 0x09, 0xFF, 0x6A, 0x3A, 0x09, 0xFF, 0x6F, 0x3B, + 0x09, 0xFF, 0x75, 0x3D, 0x0B, 0xFF, 0x7B, 0x3F, 0x0C, 0xFF, 0x7E, 0x41, 0x0C, 0xFF, 0x81, 0x42, + 0x0B, 0xFF, 0x83, 0x44, 0x0B, 0xFF, 0x84, 0x45, 0x0B, 0xFF, 0x84, 0x45, 0x0B, 0xFF, 0x84, 0x45, + 0x0B, 0xFF, 0x85, 0x45, 0x0B, 0xFF, 0x84, 0x45, 0x0B, 0xFF, 0x85, 0x46, 0x0C, 0xFF, 0x85, 0x46, + 0x0C, 0xFF, 0x85, 0x46, 0x0C, 0xFF, 0x85, 0x46, 0x0C, 0xFF, 0x86, 0x47, 0x0C, 0xFF, 0x86, 0x47, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x86, 0x47, 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x86, 0x47, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x86, 0x47, 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x86, 0x47, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x86, 0x47, 0x0C, 0xFF, 0x86, 0x47, 0x0C, 0xFF, 0x86, 0x47, + 0x0C, 0xFF, 0x86, 0x47, 0x0C, 0xFF, 0x86, 0x47, 0x0C, 0xFF, 0x86, 0x47, 0x0C, 0xFF, 0x86, 0x46, + 0x0C, 0xFF, 0x86, 0x47, 0x0D, 0xFF, 0x86, 0x47, 0x0D, 0xFF, 0x87, 0x47, 0x0D, 0xFF, 0x86, 0x46, + 0x0D, 0xFF, 0x86, 0x47, 0x0E, 0xFF, 0x87, 0x4A, 0x12, 0xFF, 0x8B, 0x4F, 0x18, 0xFF, 0x8F, 0x56, + 0x21, 0xFF, 0x92, 0x5A, 0x28, 0xFF, 0x92, 0x5D, 0x2D, 0xFF, 0x93, 0x5D, 0x2F, 0xFF, 0x92, 0x5E, + 0x2F, 0xFF, 0x92, 0x5E, 0x30, 0xFF, 0x92, 0x5E, 0x30, 0xFF, 0x91, 0x5D, 0x30, 0xFF, 0x90, 0x5D, + 0x31, 0xFF, 0x8F, 0x5D, 0x31, 0xFF, 0x8E, 0x5C, 0x32, 0xFF, 0x8D, 0x5B, 0x32, 0xFF, 0x8C, 0x5A, + 0x32, 0xFF, 0x8B, 0x59, 0x32, 0xFF, 0x8A, 0x58, 0x31, 0xFF, 0x8A, 0x58, 0x33, 0xFF, 0x8A, 0x5A, + 0x37, 0xFF, 0x8F, 0x60, 0x3F, 0xFF, 0x98, 0x6D, 0x4E, 0xFE, 0xA7, 0x80, 0x63, 0xFF, 0xAF, 0x8B, + 0x6E, 0xEC, 0xB7, 0x96, 0x7A, 0x98, 0xC7, 0xA9, 0x92, 0x37, 0xD0, 0xBA, 0xA4, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC7, 0xAB, 0x96, 0x0D, 0xB3, 0x93, 0x74, 0x61, 0xA7, 0x82, + 0x61, 0xCB, 0x95, 0x69, 0x46, 0xF8, 0x83, 0x51, 0x2C, 0xFE, 0x6F, 0x38, 0x14, 0xFF, 0x67, 0x2F, + 0x0A, 0xFF, 0x64, 0x2A, 0x05, 0xFF, 0x66, 0x2B, 0x06, 0xFF, 0x68, 0x2C, 0x06, 0xFF, 0x69, 0x2E, + 0x07, 0xFF, 0x6A, 0x2F, 0x07, 0xFF, 0x6D, 0x32, 0x07, 0xFF, 0x6F, 0x34, 0x07, 0xFF, 0x70, 0x35, + 0x08, 0xFF, 0x6F, 0x35, 0x07, 0xFF, 0x6F, 0x35, 0x07, 0xFF, 0x6F, 0x36, 0x08, 0xFF, 0x6D, 0x35, + 0x08, 0xFF, 0x66, 0x32, 0x06, 0xFF, 0x65, 0x37, 0x10, 0xFF, 0x76, 0x4F, 0x29, 0xFF, 0xA1, 0x86, + 0x6D, 0xFF, 0x98, 0x7C, 0x64, 0xFF, 0x71, 0x48, 0x23, 0xFF, 0x66, 0x3C, 0x0E, 0xFF, 0x65, 0x38, + 0x07, 0xFF, 0x6D, 0x3B, 0x0A, 0xFF, 0x77, 0x3F, 0x0A, 0xFF, 0x7C, 0x41, 0x0B, 0xFF, 0x80, 0x43, + 0x0B, 0xFF, 0x83, 0x44, 0x0C, 0xFF, 0x85, 0x46, 0x0C, 0xFF, 0x86, 0x46, 0x0C, 0xFF, 0x87, 0x47, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x47, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, + 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, + 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, + 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, + 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x49, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x87, 0x48, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x48, 0x0D, 0xFF, 0x87, 0x48, 0x0C, 0xFF, 0x87, 0x47, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x86, 0x47, 0x0D, 0xFF, 0x87, 0x48, 0x0D, 0xFF, 0x87, 0x4A, + 0x10, 0xFF, 0x89, 0x4E, 0x16, 0xFF, 0x8C, 0x54, 0x1F, 0xFF, 0x91, 0x5B, 0x29, 0xFF, 0x94, 0x5E, + 0x2E, 0xFF, 0x94, 0x5F, 0x2F, 0xFF, 0x93, 0x5F, 0x30, 0xFF, 0x93, 0x5E, 0x30, 0xFF, 0x92, 0x5E, + 0x31, 0xFF, 0x91, 0x5E, 0x31, 0xFF, 0x90, 0x5D, 0x32, 0xFF, 0x90, 0x5D, 0x32, 0xFF, 0x8F, 0x5C, + 0x32, 0xFF, 0x8E, 0x5B, 0x31, 0xFF, 0x8D, 0x5A, 0x32, 0xFF, 0x8C, 0x59, 0x32, 0xFF, 0x8B, 0x59, + 0x33, 0xFF, 0x8C, 0x5B, 0x37, 0xFF, 0x90, 0x61, 0x3F, 0xFF, 0x99, 0x6E, 0x4D, 0xFF, 0xAB, 0x84, + 0x66, 0xFF, 0xB0, 0x8D, 0x6F, 0xE5, 0xB8, 0x97, 0x7C, 0x8D, 0xD4, 0xB9, 0xA4, 0x2C, 0x00, 0x00, + 0x00, 0x00, 0xF1, 0xE3, 0xD7, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xC3, 0xA5, 0x8A, 0x07, 0xC0, 0xA1, 0x85, 0x47, 0xAF, 0x8A, 0x69, 0xB5, 0x9B, 0x71, + 0x4C, 0xF2, 0x85, 0x54, 0x2F, 0xFF, 0x72, 0x3C, 0x16, 0xFF, 0x67, 0x2E, 0x09, 0xFF, 0x66, 0x2C, + 0x06, 0xFF, 0x66, 0x2B, 0x06, 0xFF, 0x68, 0x2D, 0x06, 0xFF, 0x6A, 0x2E, 0x07, 0xFF, 0x6B, 0x30, + 0x07, 0xFF, 0x6E, 0x32, 0x08, 0xFF, 0x70, 0x35, 0x07, 0xFF, 0x70, 0x35, 0x07, 0xFF, 0x71, 0x36, + 0x08, 0xFF, 0x70, 0x37, 0x08, 0xFF, 0x6E, 0x37, 0x07, 0xFF, 0x69, 0x35, 0x07, 0xFF, 0x62, 0x33, + 0x07, 0xFF, 0x63, 0x3A, 0x12, 0xFF, 0x7A, 0x5D, 0x36, 0xFF, 0xB2, 0xA1, 0x8C, 0xFF, 0xE6, 0xDB, + 0xD5, 0xFF, 0xE0, 0xD6, 0xCE, 0xFF, 0xAD, 0x9C, 0x8B, 0xFF, 0x81, 0x60, 0x3D, 0xFF, 0x67, 0x3F, + 0x15, 0xFF, 0x65, 0x3A, 0x0B, 0xFF, 0x70, 0x3E, 0x09, 0xFF, 0x76, 0x3F, 0x09, 0xFF, 0x7C, 0x42, + 0x0A, 0xFF, 0x81, 0x44, 0x0B, 0xFF, 0x84, 0x46, 0x0C, 0xFF, 0x87, 0x48, 0x0C, 0xFF, 0x88, 0x49, + 0x0D, 0xFF, 0x89, 0x48, 0x0D, 0xFF, 0x88, 0x48, 0x0D, 0xFF, 0x89, 0x48, 0x0D, 0xFF, 0x88, 0x49, + 0x0C, 0xFF, 0x89, 0x49, 0x0C, 0xFF, 0x89, 0x49, 0x0C, 0xFF, 0x8A, 0x4A, 0x0C, 0xFF, 0x89, 0x4A, + 0x0C, 0xFF, 0x89, 0x4A, 0x0C, 0xFF, 0x89, 0x4A, 0x0C, 0xFF, 0x8A, 0x4A, 0x0C, 0xFF, 0x89, 0x4A, + 0x0C, 0xFF, 0x8A, 0x4A, 0x0C, 0xFF, 0x89, 0x49, 0x0C, 0xFF, 0x89, 0x4A, 0x0C, 0xFF, 0x89, 0x4A, + 0x0C, 0xFF, 0x8A, 0x4A, 0x0C, 0xFF, 0x89, 0x4A, 0x0C, 0xFF, 0x8A, 0x4A, 0x0C, 0xFF, 0x89, 0x4A, + 0x0C, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x89, 0x4A, 0x0D, 0xFF, 0x89, 0x49, 0x0C, 0xFF, 0x88, 0x49, + 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, + 0x0C, 0xFF, 0x88, 0x48, 0x0D, 0xFF, 0x88, 0x48, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x88, 0x48, + 0x0D, 0xFF, 0x89, 0x49, 0x0E, 0xFF, 0x89, 0x4A, 0x0F, 0xFF, 0x8B, 0x4E, 0x14, 0xFF, 0x8F, 0x55, + 0x1F, 0xFF, 0x93, 0x5C, 0x29, 0xFF, 0x94, 0x5E, 0x2E, 0xFF, 0x94, 0x5E, 0x2F, 0xFF, 0x94, 0x5F, + 0x30, 0xFF, 0x93, 0x5F, 0x31, 0xFF, 0x93, 0x5F, 0x31, 0xFF, 0x92, 0x5E, 0x31, 0xFF, 0x91, 0x5D, + 0x31, 0xFF, 0x90, 0x5C, 0x31, 0xFF, 0x8F, 0x5C, 0x32, 0xFF, 0x8E, 0x5B, 0x32, 0xFF, 0x8D, 0x5A, + 0x32, 0xFF, 0x8C, 0x5A, 0x33, 0xFF, 0x8E, 0x5E, 0x39, 0xFF, 0x91, 0x63, 0x40, 0xFF, 0x9A, 0x71, + 0x50, 0xFF, 0xAD, 0x86, 0x67, 0xFF, 0xB4, 0x90, 0x72, 0xDB, 0xBE, 0x9E, 0x85, 0x78, 0xD9, 0xC4, + 0xB6, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xCA, 0xAE, 0x92, 0x33, 0xB9, 0x97, 0x79, 0x9D, 0x9D, 0x73, 0x4F, 0xE9, 0x8B, 0x5A, + 0x35, 0xFD, 0x77, 0x41, 0x1A, 0xFF, 0x6C, 0x33, 0x0D, 0xFF, 0x67, 0x2D, 0x07, 0xFF, 0x68, 0x2D, + 0x07, 0xFF, 0x69, 0x2D, 0x07, 0xFF, 0x6B, 0x2F, 0x07, 0xFF, 0x6C, 0x31, 0x07, 0xFF, 0x6F, 0x33, + 0x08, 0xFF, 0x71, 0x35, 0x08, 0xFF, 0x71, 0x37, 0x08, 0xFF, 0x71, 0x37, 0x08, 0xFF, 0x70, 0x38, + 0x07, 0xFF, 0x70, 0x39, 0x08, 0xFF, 0x6A, 0x35, 0x07, 0xFF, 0x65, 0x36, 0x0A, 0xFF, 0x6E, 0x48, + 0x22, 0xFF, 0x98, 0x7F, 0x68, 0xFF, 0xB4, 0xA6, 0x98, 0xFF, 0xA1, 0x96, 0x86, 0xFF, 0xC7, 0xC0, + 0xB5, 0xFF, 0xEF, 0xEB, 0xE8, 0xFF, 0xED, 0xE6, 0xE2, 0xFF, 0xBF, 0xB1, 0xA5, 0xFF, 0x90, 0x6F, + 0x54, 0xFF, 0x6D, 0x48, 0x20, 0xFF, 0x67, 0x3D, 0x0E, 0xFF, 0x6D, 0x3E, 0x0C, 0xFF, 0x75, 0x41, + 0x0B, 0xFF, 0x7C, 0x43, 0x0B, 0xFF, 0x82, 0x46, 0x0C, 0xFF, 0x86, 0x48, 0x0D, 0xFF, 0x88, 0x49, + 0x0D, 0xFF, 0x89, 0x49, 0x0E, 0xFF, 0x8A, 0x49, 0x0D, 0xFF, 0x8A, 0x4A, 0x0E, 0xFF, 0x89, 0x4A, + 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, + 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, + 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, + 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, + 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x49, 0x0D, 0xFF, 0x89, 0x49, + 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x4A, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, + 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x4A, 0x0E, 0xFF, 0x88, 0x4A, + 0x10, 0xFF, 0x8A, 0x4E, 0x16, 0xFF, 0x8E, 0x56, 0x1F, 0xFF, 0x93, 0x5D, 0x2A, 0xFF, 0x96, 0x5F, + 0x2E, 0xFF, 0x96, 0x60, 0x2F, 0xFF, 0x94, 0x5F, 0x30, 0xFF, 0x94, 0x5F, 0x30, 0xFF, 0x93, 0x5F, + 0x31, 0xFF, 0x91, 0x5E, 0x31, 0xFF, 0x91, 0x5D, 0x32, 0xFF, 0x90, 0x5D, 0x32, 0xFF, 0x8F, 0x5B, + 0x32, 0xFF, 0x8D, 0x5A, 0x32, 0xFF, 0x8E, 0x5C, 0x34, 0xFF, 0x8F, 0x5F, 0x3A, 0xFF, 0x93, 0x65, + 0x43, 0xFF, 0x9E, 0x75, 0x53, 0xFF, 0xAF, 0x89, 0x69, 0xFE, 0xB9, 0x97, 0x7A, 0xCA, 0xC2, 0xA7, + 0x90, 0x62, 0xCE, 0xB6, 0xA1, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCB, 0xAE, + 0x97, 0x1C, 0xC1, 0xA0, 0x83, 0x7E, 0xA0, 0x78, 0x57, 0xDC, 0x8E, 0x5F, 0x3A, 0xFC, 0x79, 0x44, + 0x1D, 0xFF, 0x6D, 0x34, 0x0F, 0xFF, 0x69, 0x2F, 0x08, 0xFF, 0x68, 0x2D, 0x08, 0xFF, 0x6A, 0x2E, + 0x07, 0xFF, 0x6B, 0x30, 0x07, 0xFF, 0x6D, 0x32, 0x07, 0xFF, 0x70, 0x34, 0x08, 0xFF, 0x72, 0x36, + 0x08, 0xFF, 0x72, 0x36, 0x08, 0xFF, 0x72, 0x38, 0x09, 0xFF, 0x71, 0x39, 0x08, 0xFF, 0x6F, 0x39, + 0x07, 0xFF, 0x68, 0x37, 0x07, 0xFF, 0x62, 0x38, 0x09, 0xFF, 0x72, 0x52, 0x2C, 0xFF, 0xAC, 0x9C, + 0x8B, 0xFF, 0xD9, 0xD5, 0xD1, 0xFF, 0xDC, 0xDC, 0xD9, 0xFF, 0xC6, 0xBD, 0xB6, 0xFF, 0x96, 0x8E, + 0x7F, 0xFF, 0xA6, 0xA0, 0x94, 0xFF, 0xD7, 0xD5, 0xCD, 0xFF, 0xEC, 0xEA, 0xE2, 0xFF, 0xD2, 0xC8, + 0xBD, 0xFF, 0x9C, 0x85, 0x6E, 0xFF, 0x71, 0x4F, 0x2B, 0xFF, 0x68, 0x40, 0x14, 0xFF, 0x6F, 0x3F, + 0x10, 0xFF, 0x74, 0x3F, 0x0B, 0xFF, 0x7B, 0x44, 0x0C, 0xFF, 0x81, 0x46, 0x0D, 0xFF, 0x86, 0x49, + 0x0D, 0xFF, 0x89, 0x4A, 0x0E, 0xFF, 0x89, 0x4A, 0x0E, 0xFF, 0x8A, 0x4A, 0x0E, 0xFF, 0x8A, 0x4B, + 0x0E, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4A, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x89, 0x4A, + 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8B, 0x4B, 0x0E, 0xFF, 0x8A, 0x4A, + 0x0E, 0xFF, 0x8A, 0x4A, 0x0E, 0xFF, 0x8B, 0x4C, 0x10, 0xFF, 0x8D, 0x51, 0x16, 0xFF, 0x91, 0x59, + 0x22, 0xFF, 0x95, 0x5E, 0x2A, 0xFF, 0x95, 0x60, 0x2E, 0xFF, 0x95, 0x5F, 0x30, 0xFF, 0x94, 0x5F, + 0x31, 0xFF, 0x93, 0x5F, 0x31, 0xFF, 0x93, 0x5F, 0x32, 0xFF, 0x92, 0x5E, 0x31, 0xFF, 0x91, 0x5D, + 0x32, 0xFF, 0x8F, 0x5C, 0x32, 0xFF, 0x8E, 0x5B, 0x32, 0xFF, 0x8F, 0x5D, 0x35, 0xFF, 0x92, 0x61, + 0x3C, 0xFF, 0x95, 0x68, 0x44, 0xFF, 0xA2, 0x7A, 0x59, 0xFF, 0xB0, 0x8B, 0x6D, 0xF2, 0xBA, 0x99, + 0x7F, 0xB2, 0xC6, 0xAA, 0x91, 0x42, 0xCD, 0xB4, 0x9D, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDD, 0xC5, 0xB0, 0x0E, 0xC0, 0xA1, + 0x87, 0x57, 0xA5, 0x7E, 0x5C, 0xC6, 0x95, 0x68, 0x44, 0xF9, 0x80, 0x4C, 0x25, 0xFF, 0x72, 0x38, + 0x11, 0xFF, 0x6C, 0x30, 0x09, 0xFF, 0x6B, 0x2F, 0x08, 0xFF, 0x6B, 0x2F, 0x07, 0xFF, 0x6D, 0x31, + 0x07, 0xFF, 0x6E, 0x32, 0x07, 0xFF, 0x71, 0x35, 0x08, 0xFF, 0x73, 0x37, 0x08, 0xFF, 0x74, 0x38, + 0x08, 0xFF, 0x73, 0x39, 0x08, 0xFF, 0x72, 0x3A, 0x08, 0xFF, 0x70, 0x3A, 0x08, 0xFF, 0x68, 0x37, + 0x07, 0xFF, 0x64, 0x39, 0x0D, 0xFF, 0x75, 0x55, 0x30, 0xFF, 0xB0, 0x9F, 0x91, 0xFF, 0xDF, 0xDB, + 0xDA, 0xFF, 0xE5, 0xE4, 0xE1, 0xFF, 0xE2, 0xE2, 0xDF, 0xFF, 0xE2, 0xE1, 0xE0, 0xFF, 0xD3, 0xCB, + 0xC3, 0xFF, 0x90, 0x86, 0x74, 0xFF, 0x9D, 0x92, 0x83, 0xFF, 0xCD, 0xC9, 0xBD, 0xFF, 0xE5, 0xE1, + 0xD9, 0xFF, 0xDF, 0xD9, 0xD1, 0xFF, 0xB4, 0xA1, 0x90, 0xFF, 0x7F, 0x60, 0x3C, 0xFF, 0x71, 0x49, + 0x1C, 0xFF, 0x70, 0x42, 0x12, 0xFF, 0x72, 0x40, 0x0C, 0xFF, 0x79, 0x44, 0x0E, 0xFF, 0x80, 0x47, + 0x0D, 0xFF, 0x85, 0x49, 0x0E, 0xFF, 0x88, 0x4A, 0x0E, 0xFF, 0x8A, 0x4A, 0x0E, 0xFF, 0x8A, 0x4B, + 0x0E, 0xFF, 0x8B, 0x4B, 0x0E, 0xFF, 0x8B, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, + 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8B, 0x4C, 0x0D, 0xFF, 0x8B, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, + 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, + 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, + 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, + 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, + 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8B, 0x4C, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0E, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x4C, + 0x11, 0xFF, 0x8C, 0x52, 0x1A, 0xFF, 0x91, 0x59, 0x24, 0xFF, 0x96, 0x5F, 0x2D, 0xFF, 0x96, 0x61, + 0x2F, 0xFF, 0x96, 0x61, 0x30, 0xFF, 0x94, 0x60, 0x31, 0xFF, 0x93, 0x5F, 0x31, 0xFF, 0x92, 0x5E, + 0x32, 0xFF, 0x92, 0x5E, 0x32, 0xFF, 0x90, 0x5C, 0x31, 0xFF, 0x8F, 0x5C, 0x32, 0xFF, 0x90, 0x5E, + 0x36, 0xFF, 0x93, 0x63, 0x3B, 0xFF, 0x99, 0x6E, 0x4A, 0xFF, 0xA7, 0x7E, 0x5C, 0xFF, 0xB3, 0x8F, + 0x71, 0xE7, 0xC2, 0xA2, 0x88, 0x8E, 0xCC, 0xB3, 0x9B, 0x28, 0xCE, 0xB5, 0x9E, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0xB8, 0xA3, 0x3A, 0xAE, 0x8C, + 0x6D, 0x9C, 0x9B, 0x6F, 0x4A, 0xF3, 0x88, 0x57, 0x30, 0xFF, 0x76, 0x3E, 0x17, 0xFF, 0x6D, 0x32, + 0x0B, 0xFF, 0x6B, 0x2F, 0x08, 0xFF, 0x6B, 0x30, 0x07, 0xFF, 0x6D, 0x31, 0x07, 0xFF, 0x6E, 0x32, + 0x07, 0xFF, 0x72, 0x35, 0x08, 0xFF, 0x74, 0x37, 0x08, 0xFF, 0x75, 0x38, 0x08, 0xFF, 0x75, 0x39, + 0x08, 0xFF, 0x75, 0x3B, 0x08, 0xFF, 0x71, 0x3B, 0x07, 0xFF, 0x6A, 0x38, 0x06, 0xFF, 0x68, 0x3B, + 0x0A, 0xFF, 0x75, 0x54, 0x2F, 0xFF, 0xAC, 0x9D, 0x8D, 0xFF, 0xE3, 0xDF, 0xDA, 0xFF, 0xE3, 0xE2, + 0xE1, 0xFF, 0xE3, 0xE1, 0xE0, 0xFF, 0xE0, 0xE0, 0xDF, 0xFF, 0xE0, 0xE2, 0xE2, 0xFF, 0xE3, 0xE5, + 0xE3, 0xFF, 0xCE, 0xC9, 0xBF, 0xFF, 0x97, 0x8A, 0x77, 0xFF, 0x90, 0x83, 0x6F, 0xFF, 0xC1, 0xB9, + 0xAA, 0xFF, 0xE0, 0xDB, 0xD4, 0xFF, 0xDE, 0xD9, 0xD3, 0xFF, 0xC3, 0xB7, 0xAA, 0xFF, 0x8E, 0x72, + 0x52, 0xFF, 0x75, 0x4D, 0x21, 0xFF, 0x71, 0x44, 0x14, 0xFF, 0x72, 0x41, 0x0E, 0xFF, 0x78, 0x44, + 0x0C, 0xFF, 0x7F, 0x46, 0x0C, 0xFF, 0x84, 0x49, 0x0D, 0xFF, 0x89, 0x4A, 0x0D, 0xFF, 0x89, 0x4B, + 0x0E, 0xFF, 0x8B, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0E, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, + 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, + 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, + 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8C, 0x4C, + 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8D, 0x4C, + 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, + 0x0E, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8C, 0x4D, + 0x0E, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8B, 0x4C, 0x0E, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8C, 0x4B, + 0x0E, 0xFF, 0x8C, 0x4B, 0x0F, 0xFF, 0x8D, 0x4F, 0x13, 0xFF, 0x91, 0x56, 0x1C, 0xFF, 0x95, 0x5D, + 0x27, 0xFF, 0x97, 0x60, 0x2D, 0xFF, 0x96, 0x61, 0x30, 0xFF, 0x95, 0x61, 0x31, 0xFF, 0x94, 0x60, + 0x32, 0xFF, 0x93, 0x5F, 0x31, 0xFF, 0x92, 0x5E, 0x31, 0xFF, 0x91, 0x5D, 0x32, 0xFF, 0x90, 0x5D, + 0x32, 0xFF, 0x92, 0x5F, 0x36, 0xFF, 0x95, 0x66, 0x3F, 0xFF, 0xA0, 0x75, 0x50, 0xFF, 0xAC, 0x85, + 0x64, 0xFE, 0xBA, 0x96, 0x78, 0xD1, 0xCA, 0xAC, 0x93, 0x63, 0xCF, 0xB6, 0xA0, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0xA5, 0x8B, 0x16, 0xBE, 0x9E, 0x81, 0x7A, 0xA6, 0x7D, + 0x5C, 0xDB, 0x91, 0x61, 0x39, 0xFF, 0x7E, 0x47, 0x1F, 0xFF, 0x71, 0x35, 0x0E, 0xFF, 0x6D, 0x31, + 0x09, 0xFF, 0x6D, 0x31, 0x07, 0xFF, 0x6E, 0x32, 0x08, 0xFF, 0x70, 0x33, 0x08, 0xFF, 0x73, 0x36, + 0x09, 0xFF, 0x75, 0x38, 0x09, 0xFF, 0x76, 0x39, 0x09, 0xFF, 0x76, 0x3A, 0x08, 0xFF, 0x75, 0x3B, + 0x08, 0xFF, 0x74, 0x3B, 0x09, 0xFF, 0x6C, 0x39, 0x08, 0xFF, 0x6A, 0x3C, 0x0E, 0xFF, 0x73, 0x51, + 0x2B, 0xFF, 0xAC, 0x9B, 0x8A, 0xFF, 0xE1, 0xDD, 0xDA, 0xFF, 0xE6, 0xE5, 0xE3, 0xFF, 0xE3, 0xE3, + 0xE2, 0xFF, 0xE3, 0xE2, 0xE3, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE4, 0xE5, + 0xE7, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xD6, 0xD3, 0xCC, 0xFF, 0xA0, 0x97, 0x87, 0xFF, 0x84, 0x77, + 0x62, 0xFF, 0xA4, 0x9A, 0x88, 0xFF, 0xD5, 0xD0, 0xC6, 0xFF, 0xDF, 0xDC, 0xD8, 0xFF, 0xD1, 0xCB, + 0xC1, 0xFF, 0xA0, 0x89, 0x70, 0xFF, 0x7C, 0x56, 0x2B, 0xFF, 0x70, 0x45, 0x14, 0xFF, 0x70, 0x42, + 0x0C, 0xFF, 0x77, 0x45, 0x0E, 0xFF, 0x7F, 0x48, 0x0D, 0xFF, 0x84, 0x49, 0x0D, 0xFF, 0x88, 0x4B, + 0x0E, 0xFF, 0x8B, 0x4C, 0x0E, 0xFF, 0x8C, 0x4D, 0x0D, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8D, 0x4C, + 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4C, + 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, + 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, + 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4E, + 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, + 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, + 0x0E, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0E, 0xFF, 0x8C, 0x4D, 0x10, 0xFF, 0x8D, 0x51, + 0x16, 0xFF, 0x92, 0x58, 0x22, 0xFF, 0x96, 0x60, 0x2B, 0xFF, 0x98, 0x62, 0x2F, 0xFF, 0x96, 0x61, + 0x30, 0xFF, 0x95, 0x60, 0x31, 0xFF, 0x94, 0x5F, 0x32, 0xFF, 0x93, 0x5F, 0x32, 0xFF, 0x92, 0x5E, + 0x32, 0xFF, 0x92, 0x5E, 0x33, 0xFF, 0x93, 0x62, 0x37, 0xFF, 0x9A, 0x6B, 0x44, 0xFF, 0xA6, 0x7C, + 0x59, 0xFF, 0xB2, 0x8B, 0x6B, 0xF8, 0xBC, 0x99, 0x7D, 0xAE, 0xCB, 0xAE, 0x96, 0x3B, 0xE3, 0xD2, + 0xC0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xC2, 0xA3, 0x85, 0x05, 0xBA, 0x99, 0x7D, 0x47, 0xAC, 0x86, 0x65, 0xBD, 0x96, 0x69, + 0x45, 0xF9, 0x86, 0x52, 0x2A, 0xFF, 0x75, 0x3C, 0x14, 0xFF, 0x6D, 0x32, 0x0A, 0xFF, 0x6D, 0x31, + 0x07, 0xFF, 0x6E, 0x31, 0x07, 0xFF, 0x70, 0x33, 0x08, 0xFF, 0x73, 0x36, 0x09, 0xFF, 0x75, 0x38, + 0x09, 0xFF, 0x76, 0x39, 0x09, 0xFF, 0x77, 0x3A, 0x09, 0xFF, 0x77, 0x3B, 0x08, 0xFF, 0x75, 0x3C, + 0x08, 0xFF, 0x6F, 0x3A, 0x08, 0xFF, 0x6B, 0x3B, 0x0A, 0xFF, 0x72, 0x4F, 0x27, 0xFF, 0xA8, 0x96, + 0x83, 0xFF, 0xE4, 0xE0, 0xDA, 0xFF, 0xE6, 0xE6, 0xE4, 0xFF, 0xE5, 0xE4, 0xE3, 0xFF, 0xE4, 0xE4, + 0xE4, 0xFF, 0xE3, 0xE4, 0xE4, 0xFF, 0xE3, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE5, 0xFF, 0xE6, 0xE6, + 0xE7, 0xFF, 0xE7, 0xE7, 0xE8, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xDC, 0xDB, 0xD5, 0xFF, 0xAA, 0xA1, + 0x92, 0xFF, 0x85, 0x76, 0x60, 0xFF, 0x95, 0x88, 0x72, 0xFF, 0xC2, 0xBC, 0xB0, 0xFF, 0xE1, 0xDE, + 0xD9, 0xFF, 0xDC, 0xD8, 0xD1, 0xFF, 0xAF, 0x9D, 0x8B, 0xFF, 0x83, 0x62, 0x3C, 0xFF, 0x73, 0x4A, + 0x1D, 0xFF, 0x6F, 0x43, 0x11, 0xFF, 0x77, 0x45, 0x0D, 0xFF, 0x7E, 0x46, 0x0D, 0xFF, 0x83, 0x49, + 0x0D, 0xFF, 0x88, 0x4B, 0x0D, 0xFF, 0x8B, 0x4C, 0x0D, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8E, 0x4E, + 0x0F, 0xFF, 0x8F, 0x4E, 0x0F, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0D, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4E, + 0x0E, 0xFF, 0x8E, 0x4E, 0x0E, 0xFF, 0x8E, 0x4E, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4E, 0x0E, 0xFF, 0x8E, 0x4E, 0x0D, 0xFF, 0x8E, 0x4D, 0x0D, 0xFF, 0x8D, 0x4D, + 0x0D, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8D, 0x4C, + 0x0E, 0xFF, 0x8E, 0x4E, 0x12, 0xFF, 0x91, 0x56, 0x1C, 0xFF, 0x97, 0x5E, 0x27, 0xFF, 0x98, 0x62, + 0x2E, 0xFF, 0x97, 0x61, 0x30, 0xFF, 0x95, 0x61, 0x31, 0xFF, 0x94, 0x60, 0x31, 0xFF, 0x94, 0x5F, + 0x31, 0xFF, 0x93, 0x5F, 0x32, 0xFF, 0x93, 0x60, 0x34, 0xFF, 0x95, 0x64, 0x3A, 0xFF, 0x9E, 0x72, + 0x4D, 0xFF, 0xAC, 0x83, 0x61, 0xFF, 0xB6, 0x90, 0x72, 0xE8, 0xC6, 0xA4, 0x8B, 0x7C, 0xE0, 0xCE, + 0xBD, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xCE, 0xB3, 0x99, 0x22, 0xB8, 0x94, 0x76, 0x8D, 0x9F, 0x74, 0x4F, 0xE7, 0x8D, 0x5B, + 0x34, 0xFF, 0x7C, 0x44, 0x1A, 0xFF, 0x71, 0x36, 0x0D, 0xFF, 0x6F, 0x32, 0x08, 0xFF, 0x70, 0x33, + 0x08, 0xFF, 0x71, 0x34, 0x08, 0xFF, 0x73, 0x36, 0x09, 0xFF, 0x75, 0x38, 0x09, 0xFF, 0x77, 0x3A, + 0x09, 0xFF, 0x78, 0x3C, 0x09, 0xFF, 0x78, 0x3D, 0x09, 0xFF, 0x76, 0x3D, 0x09, 0xFF, 0x72, 0x3B, + 0x07, 0xFF, 0x6D, 0x3D, 0x0D, 0xFF, 0x6F, 0x48, 0x22, 0xFF, 0xA3, 0x90, 0x7B, 0xFF, 0xE1, 0xDD, + 0xD8, 0xFF, 0xE8, 0xE9, 0xE5, 0xFF, 0xE5, 0xE6, 0xE5, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE4, 0xE6, + 0xE6, 0xFF, 0xE5, 0xE5, 0xE6, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE5, 0xE6, + 0xE6, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE5, 0xE5, 0xE6, 0xFF, 0xE8, 0xE8, 0xE9, 0xFF, 0xE3, 0xE2, + 0xDF, 0xFF, 0xB3, 0xAB, 0xA0, 0xFF, 0x81, 0x75, 0x5C, 0xFF, 0x85, 0x78, 0x5F, 0xFF, 0xAF, 0xA7, + 0x99, 0xFF, 0xDE, 0xDB, 0xD7, 0xFF, 0xE3, 0xDF, 0xDA, 0xFF, 0xC6, 0xBA, 0xAC, 0xFF, 0x8E, 0x71, + 0x51, 0xFF, 0x73, 0x4E, 0x21, 0xFF, 0x70, 0x46, 0x12, 0xFF, 0x75, 0x47, 0x10, 0xFF, 0x7B, 0x47, + 0x0D, 0xFF, 0x81, 0x48, 0x0D, 0xFF, 0x87, 0x4B, 0x0D, 0xFF, 0x8B, 0x4D, 0x0E, 0xFF, 0x8D, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4F, 0x0F, 0xFF, 0x8F, 0x4E, 0x0F, 0xFF, 0x8F, 0x4E, 0x0F, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4F, + 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8E, 0x4E, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, 0x10, 0xFF, 0x8E, 0x51, 0x16, 0xFF, 0x93, 0x5B, + 0x22, 0xFF, 0x97, 0x61, 0x2D, 0xFF, 0x97, 0x62, 0x2F, 0xFF, 0x96, 0x62, 0x30, 0xFF, 0x95, 0x60, + 0x30, 0xFF, 0x94, 0x60, 0x31, 0xFF, 0x93, 0x60, 0x32, 0xFF, 0x94, 0x61, 0x35, 0xFF, 0x98, 0x68, + 0x3F, 0xFF, 0xA3, 0x78, 0x52, 0xFF, 0xB3, 0x8D, 0x6B, 0xFB, 0xBF, 0x9B, 0x7E, 0xC2, 0xCA, 0xB0, + 0x97, 0x4F, 0xD0, 0xBA, 0xA3, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0xB2, + 0x97, 0x07, 0xCA, 0xAD, 0x94, 0x5C, 0xAE, 0x88, 0x68, 0xC6, 0x96, 0x67, 0x40, 0xFD, 0x82, 0x4D, + 0x24, 0xFF, 0x75, 0x3A, 0x11, 0xFF, 0x70, 0x34, 0x0A, 0xFF, 0x70, 0x33, 0x08, 0xFF, 0x71, 0x34, + 0x07, 0xFF, 0x73, 0x36, 0x08, 0xFF, 0x75, 0x37, 0x09, 0xFF, 0x78, 0x3A, 0x09, 0xFF, 0x7A, 0x3D, + 0x0A, 0xFF, 0x7A, 0x3D, 0x09, 0xFF, 0x78, 0x3F, 0x09, 0xFF, 0x76, 0x3E, 0x09, 0xFF, 0x71, 0x3C, + 0x09, 0xFF, 0x6D, 0x46, 0x19, 0xFF, 0x96, 0x7F, 0x65, 0xFF, 0xDD, 0xD9, 0xD1, 0xFF, 0xE6, 0xE6, + 0xE5, 0xFF, 0xE5, 0xE4, 0xE3, 0xFF, 0xE5, 0xE6, 0xE5, 0xFF, 0xE6, 0xE6, 0xE7, 0xFF, 0xE5, 0xE7, + 0xE7, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE8, 0xE7, 0xE8, 0xFF, 0xE7, 0xE7, + 0xE8, 0xFF, 0xE7, 0xE7, 0xE8, 0xFF, 0xE7, 0xE8, 0xE9, 0xFF, 0xE9, 0xE8, 0xE8, 0xFF, 0xEB, 0xE9, + 0xEA, 0xFF, 0xE5, 0xE5, 0xE3, 0xFF, 0xBB, 0xB7, 0xAA, 0xFF, 0x85, 0x79, 0x60, 0xFF, 0x84, 0x72, + 0x58, 0xFF, 0x99, 0x8C, 0x7B, 0xFF, 0xCF, 0xC8, 0xC2, 0xFF, 0xE4, 0xE0, 0xDC, 0xFF, 0xD2, 0xC9, + 0xC0, 0xFF, 0x99, 0x85, 0x6D, 0xFF, 0x74, 0x52, 0x2B, 0xFF, 0x6F, 0x47, 0x16, 0xFF, 0x75, 0x45, + 0x10, 0xFF, 0x79, 0x44, 0x0C, 0xFF, 0x7F, 0x48, 0x0D, 0xFF, 0x86, 0x4A, 0x0E, 0xFF, 0x8A, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4F, 0x0F, 0xFF, 0x8F, 0x4F, 0x0F, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, + 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, + 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, + 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, + 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, + 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, + 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, + 0x0E, 0xFF, 0x90, 0x4F, 0x0F, 0xFF, 0x90, 0x4F, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x90, 0x50, + 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4E, 0x0F, 0xFF, 0x8E, 0x4E, 0x0F, 0xFF, 0x8E, 0x4E, 0x0F, 0xFF, 0x90, 0x51, + 0x13, 0xFF, 0x94, 0x59, 0x1F, 0xFF, 0x96, 0x5F, 0x29, 0xFF, 0x97, 0x61, 0x2D, 0xFF, 0x96, 0x61, + 0x2F, 0xFF, 0x95, 0x60, 0x30, 0xFF, 0x95, 0x60, 0x31, 0xFF, 0x95, 0x61, 0x33, 0xFF, 0x97, 0x65, + 0x39, 0xFF, 0x9C, 0x6E, 0x44, 0xFF, 0xA9, 0x81, 0x5D, 0xFF, 0xB8, 0x93, 0x72, 0xE8, 0xC0, 0x9E, + 0x82, 0x8D, 0xCA, 0xB1, 0x96, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0xA8, + 0x8B, 0x22, 0xBA, 0x98, 0x7A, 0x9A, 0xA3, 0x78, 0x55, 0xEC, 0x8E, 0x5A, 0x30, 0xFF, 0x7C, 0x42, + 0x18, 0xFF, 0x74, 0x37, 0x0C, 0xFF, 0x72, 0x35, 0x09, 0xFF, 0x72, 0x34, 0x08, 0xFF, 0x75, 0x37, + 0x08, 0xFF, 0x77, 0x39, 0x08, 0xFF, 0x79, 0x3A, 0x09, 0xFF, 0x7B, 0x3D, 0x0A, 0xFF, 0x7C, 0x3F, + 0x0A, 0xFF, 0x7C, 0x40, 0x0A, 0xFF, 0x7B, 0x42, 0x0B, 0xFF, 0x75, 0x40, 0x0C, 0xFF, 0x6F, 0x43, + 0x16, 0xFF, 0x8D, 0x74, 0x57, 0xFF, 0xD4, 0xCD, 0xC2, 0xFF, 0xE5, 0xE5, 0xE1, 0xFF, 0xE3, 0xE4, + 0xE3, 0xFF, 0xE4, 0xE4, 0xE5, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE6, 0xE6, 0xE7, 0xFF, 0xE7, 0xE8, + 0xE8, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xEA, 0xE9, 0xE9, 0xFF, 0xE9, 0xE8, + 0xE8, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE7, 0xE8, 0xE9, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, + 0xE9, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xE8, 0xE9, 0xE8, 0xFF, 0xC4, 0xC1, 0xBA, 0xFF, 0x90, 0x83, + 0x72, 0xFF, 0x7F, 0x6C, 0x52, 0xFF, 0x87, 0x78, 0x61, 0xFF, 0xBC, 0xB5, 0xA6, 0xFF, 0xE1, 0xDC, + 0xD6, 0xFF, 0xDE, 0xD9, 0xD2, 0xFF, 0xB0, 0xA0, 0x8E, 0xFF, 0x81, 0x64, 0x3F, 0xFF, 0x74, 0x4E, + 0x1C, 0xFF, 0x74, 0x47, 0x11, 0xFF, 0x76, 0x45, 0x0D, 0xFF, 0x7D, 0x47, 0x0E, 0xFF, 0x84, 0x4B, + 0x0E, 0xFF, 0x8A, 0x4E, 0x0F, 0xFF, 0x8E, 0x4F, 0x0E, 0xFF, 0x90, 0x50, 0x0F, 0xFF, 0x90, 0x50, + 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, + 0x0E, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x91, 0x50, + 0x0E, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x91, 0x50, + 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, + 0x0F, 0xFF, 0x91, 0x51, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x51, 0x0F, 0xFF, 0x91, 0x50, + 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, + 0x0F, 0xFF, 0x91, 0x51, 0x0F, 0xFF, 0x91, 0x51, 0x0F, 0xFF, 0x91, 0x51, 0x0F, 0xFF, 0x91, 0x50, + 0x0E, 0xFF, 0x91, 0x51, 0x0E, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x90, 0x50, + 0x0F, 0xFF, 0x90, 0x4F, 0x0F, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0F, 0xFF, 0x8F, 0x4F, 0x12, 0xFF, 0x91, 0x55, 0x1B, 0xFF, 0x95, 0x5D, 0x27, 0xFF, 0x98, 0x61, + 0x2D, 0xFF, 0x98, 0x62, 0x2F, 0xFF, 0x96, 0x61, 0x30, 0xFF, 0x95, 0x61, 0x31, 0xFF, 0x96, 0x62, + 0x34, 0xFF, 0x99, 0x67, 0x3B, 0xFF, 0xA2, 0x77, 0x4F, 0xFF, 0xB3, 0x8B, 0x67, 0xFD, 0xBE, 0x9B, + 0x7A, 0xC5, 0xCA, 0xAC, 0x93, 0x54, 0xD9, 0xC6, 0xB1, 0x07, 0xE0, 0xCE, 0xBD, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0xA3, 0x84, 0x06, 0xB7, 0x96, + 0x78, 0x55, 0xAF, 0x87, 0x65, 0xCC, 0x98, 0x69, 0x41, 0xFD, 0x87, 0x4E, 0x22, 0xFF, 0x78, 0x3C, + 0x11, 0xFF, 0x73, 0x36, 0x0A, 0xFF, 0x72, 0x35, 0x08, 0xFF, 0x74, 0x36, 0x08, 0xFF, 0x76, 0x39, + 0x08, 0xFF, 0x7A, 0x3B, 0x09, 0xFF, 0x7C, 0x3E, 0x0A, 0xFF, 0x7E, 0x3F, 0x0A, 0xFF, 0x7D, 0x41, + 0x0A, 0xFF, 0x7D, 0x42, 0x0A, 0xFF, 0x7B, 0x44, 0x0D, 0xFF, 0x73, 0x42, 0x0F, 0xFF, 0x88, 0x65, + 0x41, 0xFF, 0xCE, 0xC4, 0xB3, 0xFF, 0xE4, 0xE2, 0xDF, 0xFF, 0xE6, 0xE4, 0xE4, 0xFF, 0xE5, 0xE6, + 0xE5, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE4, 0xE6, 0xE6, 0xFF, 0xE6, 0xE6, 0xE7, 0xFF, 0xE7, 0xE8, + 0xE8, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEA, 0xEA, 0xFF, 0xEB, 0xEA, + 0xEA, 0xFF, 0xEA, 0xEA, 0xEB, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xEA, 0xEA, + 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xE8, 0xEA, 0xE9, 0xFF, 0xCA, 0xC9, + 0xC3, 0xFF, 0x97, 0x8D, 0x7D, 0xFF, 0x82, 0x6F, 0x56, 0xFF, 0x7C, 0x6B, 0x51, 0xFF, 0xAE, 0xA3, + 0x91, 0xFF, 0xDE, 0xD9, 0xD4, 0xFF, 0xDD, 0xD8, 0xD5, 0xFF, 0xBB, 0xB0, 0xA5, 0xFF, 0x8C, 0x72, + 0x51, 0xFF, 0x78, 0x53, 0x23, 0xFF, 0x74, 0x48, 0x14, 0xFF, 0x75, 0x45, 0x0F, 0xFF, 0x7C, 0x47, + 0x0D, 0xFF, 0x84, 0x4A, 0x0E, 0xFF, 0x8A, 0x4E, 0x0E, 0xFF, 0x8F, 0x50, 0x0E, 0xFF, 0x8F, 0x51, + 0x0F, 0xFF, 0x91, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x93, 0x51, 0x0F, 0xFF, 0x92, 0x51, + 0x0E, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x92, 0x51, + 0x0E, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x92, 0x52, 0x0F, 0xFF, 0x92, 0x52, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x91, 0x51, + 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x90, 0x50, 0x0E, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x90, 0x4F, + 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x8E, 0x4E, 0x10, 0xFF, 0x91, 0x53, 0x18, 0xFF, 0x95, 0x5B, + 0x24, 0xFF, 0x98, 0x60, 0x2B, 0xFF, 0x98, 0x61, 0x2E, 0xFF, 0x97, 0x62, 0x31, 0xFF, 0x96, 0x62, + 0x32, 0xFF, 0x99, 0x65, 0x37, 0xFF, 0x9F, 0x6E, 0x44, 0xFF, 0xAC, 0x82, 0x5C, 0xFF, 0xB9, 0x94, + 0x72, 0xEC, 0xCB, 0xA9, 0x8E, 0x8C, 0xDC, 0xC5, 0xB2, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xB1, 0x9A, 0x20, 0xB5, 0x92, + 0x72, 0x94, 0xA6, 0x78, 0x50, 0xEA, 0x92, 0x5C, 0x34, 0xFF, 0x7F, 0x44, 0x17, 0xFF, 0x76, 0x38, + 0x0C, 0xFF, 0x74, 0x36, 0x09, 0xFF, 0x75, 0x37, 0x09, 0xFF, 0x77, 0x38, 0x09, 0xFF, 0x79, 0x3B, + 0x09, 0xFF, 0x7C, 0x3E, 0x0A, 0xFF, 0x7F, 0x40, 0x0A, 0xFF, 0x81, 0x41, 0x0A, 0xFF, 0x7F, 0x43, + 0x0A, 0xFF, 0x7F, 0x44, 0x0D, 0xFF, 0x78, 0x41, 0x0E, 0xFF, 0x83, 0x59, 0x2D, 0xFF, 0xC3, 0xB5, + 0xA2, 0xFF, 0xE3, 0xE2, 0xDD, 0xFF, 0xE7, 0xE7, 0xE8, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE5, 0xE6, + 0xE7, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE6, 0xE7, + 0xE7, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEC, 0xEB, 0xFF, 0xEB, 0xEC, + 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEA, 0xEB, + 0xEC, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEC, 0xEE, + 0xEE, 0xFF, 0xD3, 0xD1, 0xCE, 0xFF, 0xA1, 0x96, 0x87, 0xFF, 0x7F, 0x6B, 0x51, 0xFF, 0x73, 0x61, + 0x44, 0xFF, 0x93, 0x87, 0x73, 0xFF, 0xD0, 0xC9, 0xC3, 0xFF, 0xDF, 0xDB, 0xD9, 0xFF, 0xC9, 0xC1, + 0xBA, 0xFF, 0xA0, 0x8A, 0x72, 0xFF, 0x7F, 0x5D, 0x2F, 0xFF, 0x72, 0x4A, 0x16, 0xFF, 0x72, 0x45, + 0x0E, 0xFF, 0x79, 0x48, 0x0F, 0xFF, 0x83, 0x4B, 0x0E, 0xFF, 0x8A, 0x4E, 0x0E, 0xFF, 0x8E, 0x50, + 0x0F, 0xFF, 0x90, 0x51, 0x0F, 0xFF, 0x92, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x10, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x93, 0x53, + 0x0F, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x93, 0x53, + 0x0F, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x93, 0x53, + 0x0F, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x92, 0x52, + 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x91, 0x51, + 0x0E, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x90, 0x4F, 0x0F, 0xFF, 0x8F, 0x4F, 0x10, 0xFF, 0x90, 0x52, + 0x16, 0xFF, 0x94, 0x59, 0x20, 0xFF, 0x98, 0x60, 0x2A, 0xFF, 0x9A, 0x63, 0x2F, 0xFF, 0x97, 0x62, + 0x31, 0xFF, 0x99, 0x64, 0x35, 0xFF, 0x9D, 0x69, 0x3D, 0xFF, 0xA4, 0x78, 0x50, 0xFF, 0xB3, 0x8C, + 0x68, 0xFC, 0xC5, 0xA1, 0x83, 0xC2, 0xD8, 0xBD, 0xA5, 0x4F, 0xDD, 0xC6, 0xAD, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0xC5, 0xAE, 0x05, 0xD6, 0xBE, 0xA7, 0x4E, 0xB2, 0x8E, + 0x6D, 0xC0, 0x9B, 0x69, 0x3E, 0xFB, 0x87, 0x4F, 0x25, 0xFF, 0x79, 0x3C, 0x10, 0xFF, 0x75, 0x37, + 0x0B, 0xFF, 0x76, 0x37, 0x08, 0xFF, 0x77, 0x38, 0x08, 0xFF, 0x79, 0x3B, 0x09, 0xFF, 0x7B, 0x3E, + 0x09, 0xFF, 0x7F, 0x40, 0x0A, 0xFF, 0x82, 0x42, 0x0B, 0xFF, 0x84, 0x44, 0x0B, 0xFF, 0x84, 0x47, + 0x0D, 0xFF, 0x81, 0x48, 0x0D, 0xFF, 0x83, 0x55, 0x25, 0xFF, 0xBF, 0xA8, 0x8D, 0xFF, 0xDF, 0xDD, + 0xD6, 0xFF, 0xE9, 0xE8, 0xE7, 0xFF, 0xE9, 0xEA, 0xEB, 0xFF, 0xE8, 0xE8, 0xE9, 0xFF, 0xE6, 0xE7, + 0xE8, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE6, 0xE7, 0xE6, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE7, 0xE8, + 0xE8, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEC, 0xED, + 0xEC, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEC, 0xED, 0xED, 0xFF, 0xEC, 0xED, + 0xEE, 0xFF, 0xEC, 0xED, 0xEE, 0xFF, 0xEB, 0xED, 0xEE, 0xFF, 0xEC, 0xED, 0xED, 0xFF, 0xED, 0xEE, + 0xEE, 0xFF, 0xEC, 0xEE, 0xEF, 0xFF, 0xDB, 0xDD, 0xD9, 0xFF, 0xA6, 0xA0, 0x91, 0xFF, 0x7F, 0x6B, + 0x52, 0xFF, 0x71, 0x5D, 0x41, 0xFF, 0x8B, 0x7D, 0x67, 0xFF, 0xC2, 0xBA, 0xB1, 0xFF, 0xDE, 0xDA, + 0xD8, 0xFF, 0xD3, 0xCE, 0xCA, 0xFF, 0xAA, 0x98, 0x87, 0xFF, 0x85, 0x66, 0x3F, 0xFF, 0x76, 0x4F, + 0x20, 0xFF, 0x71, 0x46, 0x12, 0xFF, 0x79, 0x48, 0x0F, 0xFF, 0x81, 0x4A, 0x0E, 0xFF, 0x87, 0x4E, + 0x0F, 0xFF, 0x8D, 0x50, 0x0F, 0xFF, 0x8F, 0x51, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x94, 0x53, + 0x10, 0xFF, 0x94, 0x53, 0x10, 0xFF, 0x94, 0x53, 0x10, 0xFF, 0x94, 0x53, 0x10, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x93, 0x53, + 0x0F, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x92, 0x52, + 0x0E, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x8F, 0x4F, + 0x0F, 0xFF, 0x91, 0x52, 0x14, 0xFF, 0x94, 0x59, 0x1F, 0xFF, 0x98, 0x5F, 0x28, 0xFF, 0x98, 0x62, + 0x2E, 0xFF, 0x99, 0x64, 0x32, 0xFF, 0x9D, 0x68, 0x3A, 0xFF, 0x9F, 0x6F, 0x45, 0xFF, 0xAD, 0x83, + 0x5D, 0xFF, 0xBB, 0x97, 0x75, 0xE7, 0xC8, 0xA7, 0x8D, 0x83, 0xC5, 0xAA, 0x8C, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD3, 0xB7, 0x9C, 0x18, 0xCB, 0xAC, 0x90, 0x7E, 0xA9, 0x80, + 0x5C, 0xE1, 0x93, 0x5E, 0x31, 0xFF, 0x81, 0x45, 0x19, 0xFF, 0x79, 0x3A, 0x0D, 0xFF, 0x76, 0x38, + 0x09, 0xFF, 0x77, 0x38, 0x08, 0xFF, 0x79, 0x3B, 0x08, 0xFF, 0x7C, 0x3E, 0x09, 0xFF, 0x7F, 0x40, + 0x0A, 0xFF, 0x82, 0x42, 0x0B, 0xFF, 0x84, 0x44, 0x0B, 0xFF, 0x86, 0x46, 0x0C, 0xFF, 0x8A, 0x4B, + 0x11, 0xFF, 0x82, 0x47, 0x09, 0xFF, 0x92, 0x68, 0x35, 0xFF, 0xD4, 0xC3, 0xB9, 0xFF, 0xE8, 0xE6, + 0xE2, 0xFF, 0xEB, 0xEA, 0xE9, 0xFF, 0xEB, 0xEC, 0xED, 0xFF, 0xE9, 0xEA, 0xEB, 0xFF, 0xE9, 0xE9, + 0xEA, 0xFF, 0xE8, 0xE9, 0xE8, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE8, 0xE9, + 0xE8, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE9, 0xEA, 0xE9, 0xFF, 0xEB, 0xEB, 0xEA, 0xFF, 0xEC, 0xED, + 0xEC, 0xFF, 0xED, 0xEE, 0xED, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, + 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEC, 0xEE, 0xEE, 0xFF, 0xED, 0xED, 0xEE, 0xFF, 0xED, 0xEE, + 0xEE, 0xFF, 0xED, 0xEF, 0xEF, 0xFF, 0xED, 0xF0, 0xF0, 0xFF, 0xE2, 0xE6, 0xE3, 0xFF, 0xB5, 0xAF, + 0xA6, 0xFF, 0x82, 0x70, 0x59, 0xFF, 0x6E, 0x5D, 0x40, 0xFF, 0x79, 0x6A, 0x50, 0xFF, 0xB1, 0xA7, + 0x96, 0xFF, 0xDD, 0xDA, 0xD7, 0xFF, 0xDB, 0xD8, 0xD5, 0xFF, 0xBC, 0xB0, 0xA3, 0xFF, 0x90, 0x75, + 0x54, 0xFF, 0x76, 0x53, 0x25, 0xFF, 0x72, 0x49, 0x14, 0xFF, 0x77, 0x4A, 0x13, 0xFF, 0x7F, 0x4B, + 0x10, 0xFF, 0x86, 0x4D, 0x0F, 0xFF, 0x8C, 0x50, 0x10, 0xFF, 0x91, 0x53, 0x10, 0xFF, 0x94, 0x54, + 0x10, 0xFF, 0x95, 0x54, 0x11, 0xFF, 0x95, 0x54, 0x11, 0xFF, 0x95, 0x54, 0x11, 0xFF, 0x95, 0x54, + 0x11, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, + 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, + 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x95, 0x54, + 0x0F, 0xFF, 0x95, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x54, 0x0F, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x54, 0x0F, 0xFF, 0x94, 0x54, + 0x0F, 0xFF, 0x94, 0x54, 0x0F, 0xFF, 0x94, 0x54, 0x0F, 0xFF, 0x94, 0x54, 0x0F, 0xFF, 0x94, 0x54, + 0x0F, 0xFF, 0x94, 0x54, 0x0F, 0xFF, 0x94, 0x54, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x92, 0x52, 0x0F, 0xFF, 0x91, 0x50, + 0x0E, 0xFF, 0x90, 0x50, 0x0F, 0xFF, 0x90, 0x52, 0x13, 0xFF, 0x92, 0x57, 0x1B, 0xFF, 0x97, 0x5E, + 0x27, 0xFF, 0x9A, 0x63, 0x2E, 0xFF, 0x9C, 0x66, 0x34, 0xFF, 0x9D, 0x6A, 0x3D, 0xFF, 0xAA, 0x7E, + 0x56, 0xFF, 0xB9, 0x91, 0x6B, 0xFC, 0xBC, 0x95, 0x76, 0xB8, 0xCC, 0xB0, 0x91, 0x3D, 0xF9, 0xFF, + 0xFB, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xC9, 0xB1, 0x97, 0x02, 0xC0, 0xA3, 0x86, 0x35, 0xBA, 0x93, 0x70, 0xAF, 0xA0, 0x71, + 0x49, 0xF5, 0x90, 0x56, 0x28, 0xFF, 0x80, 0x42, 0x15, 0xFF, 0x79, 0x3A, 0x0C, 0xFF, 0x78, 0x39, + 0x08, 0xFF, 0x79, 0x3A, 0x08, 0xFF, 0x7B, 0x3D, 0x09, 0xFF, 0x7E, 0x40, 0x09, 0xFF, 0x81, 0x42, + 0x0B, 0xFF, 0x84, 0x44, 0x0C, 0xFF, 0x86, 0x47, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x8B, 0x4C, + 0x0F, 0xFF, 0x8C, 0x4D, 0x11, 0xFF, 0x84, 0x4F, 0x10, 0xFF, 0xAA, 0x8F, 0x6E, 0xFF, 0xE1, 0xDF, + 0xDA, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEB, 0xEC, 0xED, 0xFF, 0xEB, 0xEC, 0xED, 0xFF, 0xEA, 0xEB, + 0xEB, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEA, 0xEB, + 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEC, 0xEC, + 0xEB, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEE, 0xEF, 0xEE, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xEE, 0xEE, 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, 0xF0, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xEE, 0xEF, 0xF0, 0xFF, 0xEE, 0xF0, 0xF0, 0xFF, 0xEE, 0xF1, 0xF1, 0xFF, 0xEB, 0xED, + 0xED, 0xFF, 0xC3, 0xC1, 0xBA, 0xFF, 0x85, 0x75, 0x5F, 0xFF, 0x71, 0x5F, 0x3F, 0xFF, 0x7C, 0x6C, + 0x49, 0xFF, 0x9E, 0x92, 0x7D, 0xFF, 0xD2, 0xCD, 0xC9, 0xFF, 0xDF, 0xDC, 0xDB, 0xFF, 0xCB, 0xC2, + 0xBB, 0xFF, 0x9C, 0x88, 0x70, 0xFF, 0x7A, 0x59, 0x31, 0xFF, 0x73, 0x4C, 0x19, 0xFF, 0x78, 0x49, + 0x13, 0xFF, 0x7D, 0x49, 0x10, 0xFF, 0x85, 0x4E, 0x11, 0xFF, 0x8C, 0x50, 0x11, 0xFF, 0x91, 0x53, + 0x11, 0xFF, 0x95, 0x55, 0x12, 0xFF, 0x96, 0x56, 0x12, 0xFF, 0x96, 0x55, 0x12, 0xFF, 0x96, 0x55, + 0x12, 0xFF, 0x96, 0x55, 0x11, 0xFF, 0x96, 0x55, 0x11, 0xFF, 0x96, 0x55, 0x11, 0xFF, 0x96, 0x56, + 0x11, 0xFF, 0x96, 0x56, 0x11, 0xFF, 0x96, 0x56, 0x11, 0xFF, 0x96, 0x56, 0x11, 0xFF, 0x96, 0x56, + 0x11, 0xFF, 0x96, 0x56, 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x96, 0x55, + 0x10, 0xFF, 0x96, 0x54, 0x10, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x95, 0x54, + 0x0F, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x95, 0x54, + 0x0F, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x96, 0x55, 0x0F, 0xFF, 0x95, 0x55, + 0x0F, 0xFF, 0x96, 0x55, 0x0F, 0xFF, 0x95, 0x55, 0x0F, 0xFF, 0x96, 0x55, 0x0F, 0xFF, 0x95, 0x55, + 0x0F, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x94, 0x54, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x92, 0x52, + 0x0F, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x8F, 0x50, 0x0E, 0xFF, 0x91, 0x53, 0x12, 0xFF, 0x93, 0x58, + 0x1C, 0xFF, 0x98, 0x5F, 0x26, 0xFF, 0x9B, 0x64, 0x2E, 0xFF, 0x9C, 0x68, 0x36, 0xFF, 0xA4, 0x76, + 0x4B, 0xFF, 0xB2, 0x89, 0x61, 0xFF, 0xB6, 0x8C, 0x6A, 0xDE, 0xE2, 0xC7, 0xAD, 0x69, 0xFE, 0xFF, + 0xFF, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF4, 0xE8, 0xDB, 0x0A, 0xC3, 0xA1, 0x84, 0x62, 0xB0, 0x81, 0x58, 0xD8, 0x9A, 0x66, + 0x3D, 0xFD, 0x8B, 0x4F, 0x20, 0xFF, 0x7D, 0x3E, 0x0F, 0xFF, 0x7A, 0x3A, 0x0A, 0xFF, 0x7B, 0x3B, + 0x09, 0xFF, 0x7C, 0x3D, 0x09, 0xFF, 0x7F, 0x40, 0x0A, 0xFF, 0x81, 0x42, 0x0A, 0xFF, 0x83, 0x44, + 0x0C, 0xFF, 0x86, 0x47, 0x0C, 0xFF, 0x88, 0x49, 0x0D, 0xFF, 0x8A, 0x4B, 0x0E, 0xFF, 0x8B, 0x4C, + 0x0E, 0xFF, 0x8A, 0x4D, 0x0F, 0xFF, 0x8A, 0x51, 0x13, 0xFF, 0x8A, 0x5B, 0x20, 0xFF, 0xB6, 0x9F, + 0x84, 0xFF, 0xE8, 0xE4, 0xE0, 0xFF, 0xEE, 0xED, 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEB, 0xED, + 0xED, 0xFF, 0xEB, 0xED, 0xED, 0xFF, 0xEB, 0xED, 0xED, 0xFF, 0xEC, 0xED, 0xEC, 0xFF, 0xEC, 0xED, + 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEC, 0xEC, + 0xEC, 0xFF, 0xEC, 0xED, 0xEC, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, 0xF0, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xEF, 0xEF, + 0xEF, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEF, 0xF1, 0xF0, 0xFF, 0xED, 0xF0, 0xF0, 0xFF, 0xEF, 0xF1, + 0xF2, 0xFF, 0xED, 0xEF, 0xF0, 0xFF, 0xCE, 0xCD, 0xC9, 0xFF, 0x8E, 0x81, 0x6F, 0xFF, 0x75, 0x64, + 0x44, 0xFF, 0x77, 0x65, 0x42, 0xFF, 0x8F, 0x80, 0x67, 0xFF, 0xC9, 0xC5, 0xBB, 0xFF, 0xE2, 0xDF, + 0xDE, 0xFF, 0xD8, 0xD3, 0xCD, 0xFF, 0xB0, 0xA2, 0x8F, 0xFF, 0x85, 0x6A, 0x46, 0xFF, 0x79, 0x54, + 0x23, 0xFF, 0x78, 0x4C, 0x18, 0xFF, 0x7C, 0x4C, 0x12, 0xFF, 0x83, 0x4E, 0x12, 0xFF, 0x8B, 0x51, + 0x12, 0xFF, 0x91, 0x55, 0x13, 0xFF, 0x95, 0x56, 0x13, 0xFF, 0x96, 0x57, 0x13, 0xFF, 0x97, 0x57, + 0x13, 0xFF, 0x97, 0x58, 0x13, 0xFF, 0x98, 0x58, 0x13, 0xFF, 0x98, 0x58, 0x13, 0xFF, 0x98, 0x58, + 0x13, 0xFF, 0x98, 0x58, 0x12, 0xFF, 0x98, 0x58, 0x12, 0xFF, 0x98, 0x58, 0x12, 0xFF, 0x98, 0x58, + 0x12, 0xFF, 0x98, 0x58, 0x12, 0xFF, 0x98, 0x57, 0x12, 0xFF, 0x98, 0x57, 0x12, 0xFF, 0x98, 0x57, + 0x12, 0xFF, 0x98, 0x57, 0x11, 0xFF, 0x97, 0x56, 0x11, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x97, 0x56, + 0x10, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x97, 0x55, 0x10, 0xFF, 0x97, 0x55, 0x10, 0xFF, 0x96, 0x55, + 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x97, 0x55, 0x10, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x97, 0x56, + 0x10, 0xFF, 0x97, 0x57, 0x10, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x96, 0x56, + 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x95, 0x55, 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x94, 0x54, + 0x10, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x91, 0x51, 0x0F, 0xFF, 0x91, 0x53, + 0x13, 0xFF, 0x94, 0x57, 0x1A, 0xFF, 0x98, 0x5E, 0x26, 0xFF, 0x9C, 0x66, 0x32, 0xFF, 0xA0, 0x6F, + 0x40, 0xFF, 0xAE, 0x83, 0x59, 0xFF, 0xB6, 0x8A, 0x66, 0xF1, 0xD6, 0xBD, 0xA0, 0x9B, 0xE3, 0xCF, + 0xBB, 0x26, 0xDC, 0xC7, 0xB0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xF3, 0xEA, 0x1F, 0xC9, 0xA6, 0x88, 0x8D, 0xA9, 0x77, 0x4C, 0xF1, 0x92, 0x5D, + 0x32, 0xFF, 0x86, 0x48, 0x18, 0xFF, 0x7B, 0x3C, 0x0C, 0xFF, 0x7C, 0x3C, 0x0A, 0xFF, 0x7D, 0x3C, + 0x09, 0xFF, 0x7F, 0x3F, 0x09, 0xFF, 0x81, 0x42, 0x0A, 0xFF, 0x84, 0x44, 0x0B, 0xFF, 0x86, 0x47, + 0x0C, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x8B, 0x4B, 0x0E, 0xFF, 0x8D, 0x4D, 0x0F, 0xFF, 0x8E, 0x4E, + 0x0E, 0xFF, 0x8E, 0x4F, 0x0F, 0xFF, 0x8F, 0x51, 0x11, 0xFF, 0x8D, 0x53, 0x13, 0xFF, 0x94, 0x68, + 0x2D, 0xFF, 0xCA, 0xB3, 0x9C, 0xFF, 0xED, 0xE9, 0xE5, 0xFF, 0xEF, 0xEE, 0xEF, 0xFF, 0xED, 0xED, + 0xEE, 0xFF, 0xEC, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, + 0xED, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, 0xED, 0xFF, 0xEC, 0xED, 0xED, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xED, 0xEE, 0xED, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xF0, 0xF1, + 0xF1, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xF0, 0xF2, 0xF1, 0xFF, 0xF0, 0xF1, 0xF2, 0xFF, 0xF0, 0xF2, + 0xF3, 0xFF, 0xF2, 0xF3, 0xF4, 0xFF, 0xF1, 0xF2, 0xF4, 0xFF, 0xD9, 0xD8, 0xD4, 0xFF, 0x95, 0x8A, + 0x73, 0xFF, 0x78, 0x66, 0x44, 0xFF, 0x7E, 0x6A, 0x46, 0xFF, 0x85, 0x73, 0x55, 0xFF, 0xBB, 0xB2, + 0xA2, 0xFF, 0xE2, 0xDF, 0xDC, 0xFF, 0xDF, 0xDA, 0xD7, 0xFF, 0xBC, 0xB2, 0xA4, 0xFF, 0x8F, 0x77, + 0x56, 0xFF, 0x7D, 0x5A, 0x2C, 0xFF, 0x78, 0x4E, 0x1A, 0xFF, 0x7A, 0x4B, 0x14, 0xFF, 0x82, 0x4E, + 0x12, 0xFF, 0x8B, 0x51, 0x13, 0xFF, 0x91, 0x56, 0x13, 0xFF, 0x96, 0x58, 0x13, 0xFF, 0x97, 0x59, + 0x14, 0xFF, 0x98, 0x59, 0x13, 0xFF, 0x99, 0x5A, 0x14, 0xFF, 0x9A, 0x59, 0x14, 0xFF, 0x99, 0x59, + 0x14, 0xFF, 0x9A, 0x59, 0x13, 0xFF, 0x99, 0x5A, 0x13, 0xFF, 0x9A, 0x5A, 0x13, 0xFF, 0x99, 0x5A, + 0x14, 0xFF, 0x9A, 0x59, 0x14, 0xFF, 0x99, 0x59, 0x13, 0xFF, 0x9A, 0x59, 0x13, 0xFF, 0x99, 0x59, + 0x13, 0xFF, 0x99, 0x59, 0x13, 0xFF, 0x98, 0x58, 0x12, 0xFF, 0x99, 0x58, 0x12, 0xFF, 0x98, 0x58, + 0x11, 0xFF, 0x99, 0x58, 0x11, 0xFF, 0x98, 0x57, 0x11, 0xFF, 0x98, 0x56, 0x10, 0xFF, 0x97, 0x56, + 0x10, 0xFF, 0x98, 0x56, 0x10, 0xFF, 0x98, 0x56, 0x10, 0xFF, 0x98, 0x56, 0x10, 0xFF, 0x98, 0x57, + 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x97, 0x57, + 0x10, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x96, 0x56, 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x95, 0x55, + 0x10, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x93, 0x51, 0x0E, 0xFF, 0x91, 0x51, + 0x0E, 0xFF, 0x92, 0x53, 0x12, 0xFF, 0x94, 0x57, 0x1B, 0xFF, 0x9A, 0x60, 0x29, 0xFF, 0x9F, 0x6B, + 0x39, 0xFF, 0xA8, 0x79, 0x4C, 0xFF, 0xB3, 0x87, 0x62, 0xFC, 0xBB, 0x9C, 0x7A, 0xC2, 0xCA, 0xAB, + 0x8E, 0x49, 0xD1, 0xBB, 0xA0, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD3, 0xC1, + 0xB0, 0x03, 0xDB, 0xC5, 0xB0, 0x3A, 0xBB, 0x96, 0x76, 0xBA, 0xA4, 0x72, 0x44, 0xF9, 0x8F, 0x56, + 0x26, 0xFF, 0x82, 0x44, 0x12, 0xFF, 0x7C, 0x3C, 0x0B, 0xFF, 0x7E, 0x3D, 0x0A, 0xFF, 0x80, 0x3E, + 0x0A, 0xFF, 0x82, 0x41, 0x09, 0xFF, 0x85, 0x44, 0x0A, 0xFF, 0x87, 0x46, 0x0B, 0xFF, 0x89, 0x49, + 0x0D, 0xFF, 0x8C, 0x4B, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x90, 0x4F, 0x0F, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x92, 0x53, 0x10, 0xFF, 0x92, 0x53, 0x10, 0xFF, 0x90, 0x53, 0x11, 0xFF, 0x89, 0x56, + 0x18, 0xFF, 0x9E, 0x76, 0x42, 0xFF, 0xD8, 0xC8, 0xB9, 0xFF, 0xF2, 0xED, 0xE8, 0xFF, 0xEE, 0xED, + 0xEC, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEC, 0xEE, 0xEF, 0xFF, 0xEC, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, + 0xEE, 0xFF, 0xEE, 0xEF, 0xEE, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, + 0xF2, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, + 0xF2, 0xFF, 0xF0, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, 0xF3, 0xFF, 0xF2, 0xF3, 0xF5, 0xFF, 0xE5, 0xE5, + 0xE2, 0xFF, 0xA4, 0x9D, 0x8D, 0xFF, 0x7B, 0x6A, 0x4C, 0xFF, 0x7A, 0x64, 0x42, 0xFF, 0x7A, 0x65, + 0x45, 0xFF, 0xAA, 0x9D, 0x89, 0xFF, 0xDB, 0xD7, 0xD4, 0xFF, 0xE5, 0xE2, 0xE0, 0xFF, 0xCC, 0xC7, + 0xBD, 0xFF, 0xA5, 0x92, 0x7A, 0xFF, 0x84, 0x64, 0x38, 0xFF, 0x79, 0x52, 0x1E, 0xFF, 0x79, 0x4D, + 0x15, 0xFF, 0x7F, 0x4F, 0x14, 0xFF, 0x8A, 0x54, 0x13, 0xFF, 0x92, 0x57, 0x14, 0xFF, 0x96, 0x59, + 0x14, 0xFF, 0x98, 0x5A, 0x15, 0xFF, 0x9A, 0x5A, 0x14, 0xFF, 0x9B, 0x5B, 0x15, 0xFF, 0x9B, 0x5B, + 0x15, 0xFF, 0x9B, 0x5B, 0x15, 0xFF, 0x9B, 0x5B, 0x15, 0xFF, 0x9B, 0x5B, 0x15, 0xFF, 0x9B, 0x5B, + 0x15, 0xFF, 0x9B, 0x5B, 0x15, 0xFF, 0x9B, 0x5B, 0x15, 0xFF, 0x9B, 0x5B, 0x15, 0xFF, 0x9B, 0x5B, + 0x14, 0xFF, 0x9B, 0x5B, 0x14, 0xFF, 0x9B, 0x5B, 0x14, 0xFF, 0x9B, 0x5B, 0x14, 0xFF, 0x9B, 0x5A, + 0x14, 0xFF, 0x9B, 0x5A, 0x14, 0xFF, 0x9A, 0x5A, 0x13, 0xFF, 0x9A, 0x59, 0x12, 0xFF, 0x99, 0x58, + 0x12, 0xFF, 0x99, 0x57, 0x11, 0xFF, 0x99, 0x57, 0x10, 0xFF, 0x99, 0x57, 0x10, 0xFF, 0x99, 0x57, + 0x10, 0xFF, 0x99, 0x58, 0x10, 0xFF, 0x99, 0x58, 0x10, 0xFF, 0x99, 0x58, 0x10, 0xFF, 0x99, 0x57, + 0x10, 0xFF, 0x99, 0x57, 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x97, 0x57, + 0x10, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x96, 0x55, 0x0F, 0xFF, 0x95, 0x53, 0x0F, 0xFF, 0x93, 0x52, + 0x0E, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x52, 0x12, 0xFF, 0x95, 0x57, 0x1B, 0xFF, 0x9D, 0x64, + 0x2F, 0xFF, 0xA4, 0x72, 0x43, 0xFF, 0xB0, 0x81, 0x57, 0xFF, 0xC6, 0xA2, 0x80, 0xDD, 0xC7, 0xA7, + 0x8B, 0x74, 0xD8, 0xBB, 0x9F, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDA, 0xC1, + 0xA4, 0x0A, 0xC6, 0xA7, 0x88, 0x5E, 0xB1, 0x87, 0x64, 0xD6, 0xA0, 0x6A, 0x39, 0xFC, 0x8D, 0x51, + 0x20, 0xFF, 0x7E, 0x3F, 0x0F, 0xFF, 0x7D, 0x3D, 0x0A, 0xFF, 0x7F, 0x3D, 0x0A, 0xFF, 0x81, 0x40, + 0x0A, 0xFF, 0x84, 0x43, 0x0A, 0xFF, 0x86, 0x46, 0x0B, 0xFF, 0x89, 0x48, 0x0C, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x90, 0x4F, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x93, 0x53, + 0x0F, 0xFF, 0x94, 0x54, 0x10, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x54, 0x0E, 0xFF, 0x8C, 0x53, + 0x0F, 0xFF, 0x8F, 0x5B, 0x1B, 0xFF, 0xA7, 0x87, 0x5D, 0xFF, 0xE2, 0xD8, 0xCE, 0xFF, 0xF0, 0xEE, + 0xEC, 0xFF, 0xEE, 0xEE, 0xEF, 0xFF, 0xEC, 0xEE, 0xEF, 0xFF, 0xED, 0xEE, 0xEF, 0xFF, 0xED, 0xEF, + 0xEF, 0xFF, 0xEE, 0xEF, 0xEE, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEF, + 0xEE, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF1, 0xF2, + 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, + 0xF3, 0xFF, 0xF1, 0xF2, 0xF3, 0xFF, 0xF2, 0xF2, 0xF4, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF3, 0xF2, + 0xF5, 0xFF, 0xE8, 0xE9, 0xE8, 0xFF, 0xB4, 0xB0, 0xA4, 0xFF, 0x83, 0x75, 0x5A, 0xFF, 0x7A, 0x66, + 0x45, 0xFF, 0x76, 0x62, 0x3F, 0xFF, 0x9E, 0x91, 0x7B, 0xFF, 0xD9, 0xD4, 0xCF, 0xFF, 0xE4, 0xE1, + 0xE0, 0xFF, 0xD8, 0xD3, 0xCE, 0xFF, 0xAE, 0xA0, 0x8E, 0xFF, 0x8A, 0x6E, 0x49, 0xFF, 0x7B, 0x56, + 0x27, 0xFF, 0x76, 0x4D, 0x18, 0xFF, 0x7E, 0x50, 0x14, 0xFF, 0x88, 0x53, 0x14, 0xFF, 0x8F, 0x57, + 0x15, 0xFF, 0x95, 0x59, 0x15, 0xFF, 0x99, 0x5B, 0x15, 0xFF, 0x9B, 0x5B, 0x16, 0xFF, 0x9C, 0x5C, + 0x16, 0xFF, 0x9C, 0x5C, 0x16, 0xFF, 0x9C, 0x5C, 0x16, 0xFF, 0x9C, 0x5C, 0x16, 0xFF, 0x9C, 0x5C, + 0x16, 0xFF, 0x9C, 0x5C, 0x16, 0xFF, 0x9C, 0x5D, 0x16, 0xFF, 0x9D, 0x5D, 0x16, 0xFF, 0x9C, 0x5C, + 0x16, 0xFF, 0x9C, 0x5C, 0x16, 0xFF, 0x9C, 0x5D, 0x16, 0xFF, 0x9D, 0x5C, 0x16, 0xFF, 0x9C, 0x5C, + 0x16, 0xFF, 0x9C, 0x5C, 0x16, 0xFF, 0x9C, 0x5C, 0x15, 0xFF, 0x9C, 0x5C, 0x14, 0xFF, 0x9B, 0x5B, + 0x14, 0xFF, 0x9B, 0x59, 0x13, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x9A, 0x58, 0x11, 0xFF, 0x9A, 0x58, + 0x11, 0xFF, 0x9A, 0x58, 0x11, 0xFF, 0x9A, 0x58, 0x10, 0xFF, 0x9A, 0x58, 0x10, 0xFF, 0x9A, 0x58, + 0x10, 0xFF, 0x9A, 0x58, 0x10, 0xFF, 0x99, 0x58, 0x10, 0xFF, 0x99, 0x58, 0x10, 0xFF, 0x98, 0x58, + 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x97, 0x55, 0x0F, 0xFF, 0x95, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x92, 0x52, 0x0F, 0xFF, 0x93, 0x53, 0x12, 0xFF, 0x99, 0x5C, + 0x22, 0xFF, 0xA1, 0x6C, 0x3B, 0xFF, 0xA7, 0x78, 0x4E, 0xFF, 0xC2, 0x9C, 0x76, 0xF3, 0xD4, 0xB1, + 0x8E, 0x9A, 0xD5, 0xBA, 0xA3, 0x2C, 0xA7, 0x96, 0x7E, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD2, 0xB7, + 0x97, 0x18, 0xC8, 0xA9, 0x8A, 0x84, 0xA8, 0x7C, 0x56, 0xE9, 0x9B, 0x63, 0x33, 0xFD, 0x88, 0x4B, + 0x1A, 0xFF, 0x80, 0x40, 0x0D, 0xFF, 0x80, 0x3E, 0x0A, 0xFF, 0x81, 0x3F, 0x0A, 0xFF, 0x83, 0x43, + 0x0A, 0xFF, 0x86, 0x46, 0x0B, 0xFF, 0x88, 0x49, 0x0C, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8D, 0x4D, + 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x91, 0x51, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x95, 0x54, + 0x10, 0xFF, 0x96, 0x56, 0x10, 0xFF, 0x96, 0x56, 0x0F, 0xFF, 0x97, 0x57, 0x10, 0xFF, 0x94, 0x56, + 0x0F, 0xFF, 0x90, 0x56, 0x12, 0xFF, 0x92, 0x62, 0x27, 0xFF, 0xB6, 0x9B, 0x7D, 0xFF, 0xE8, 0xE2, + 0xD5, 0xFF, 0xF3, 0xF0, 0xEF, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEC, 0xEE, 0xEE, 0xFF, 0xEC, 0xEE, + 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, + 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xF0, 0xF1, + 0xF1, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF1, 0xF2, + 0xF2, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF0, 0xF2, 0xF2, 0xFF, 0xF0, 0xF1, 0xF2, 0xFF, 0xF1, 0xF1, + 0xF2, 0xFF, 0xF1, 0xF2, 0xF4, 0xFF, 0xEB, 0xED, 0xEE, 0xFF, 0xC3, 0xBF, 0xB8, 0xFF, 0x92, 0x83, + 0x68, 0xFF, 0x7D, 0x68, 0x44, 0xFF, 0x71, 0x5C, 0x38, 0xFF, 0x8C, 0x7D, 0x63, 0xFF, 0xCF, 0xCA, + 0xBF, 0xFF, 0xE5, 0xE4, 0xE2, 0xFF, 0xDD, 0xDB, 0xD7, 0xFF, 0xC1, 0xB7, 0xAC, 0xFF, 0x96, 0x7E, + 0x60, 0xFF, 0x7B, 0x5B, 0x2D, 0xFF, 0x77, 0x51, 0x1B, 0xFF, 0x7D, 0x52, 0x19, 0xFF, 0x87, 0x54, + 0x16, 0xFF, 0x8F, 0x57, 0x15, 0xFF, 0x95, 0x5A, 0x17, 0xFF, 0x99, 0x5C, 0x18, 0xFF, 0x9C, 0x5D, + 0x17, 0xFF, 0x9D, 0x5E, 0x18, 0xFF, 0x9D, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, + 0x18, 0xFF, 0x9E, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, + 0x18, 0xFF, 0x9E, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, + 0x18, 0xFF, 0x9E, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, 0x17, 0xFF, 0x9E, 0x5E, 0x17, 0xFF, 0x9E, 0x5E, + 0x17, 0xFF, 0x9D, 0x5D, 0x16, 0xFF, 0x9D, 0x5D, 0x15, 0xFF, 0x9C, 0x5C, 0x14, 0xFF, 0x9C, 0x5B, + 0x13, 0xFF, 0x9B, 0x5A, 0x12, 0xFF, 0x9B, 0x59, 0x11, 0xFF, 0x9B, 0x59, 0x11, 0xFF, 0x9B, 0x59, + 0x11, 0xFF, 0x9A, 0x5A, 0x11, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x9A, 0x59, + 0x11, 0xFF, 0x99, 0x58, 0x11, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x96, 0x55, + 0x10, 0xFF, 0x95, 0x55, 0x10, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x92, 0x52, 0x0F, 0xFF, 0x94, 0x55, + 0x15, 0xFF, 0x9C, 0x63, 0x2B, 0xFF, 0xA3, 0x75, 0x47, 0xFF, 0xC2, 0x99, 0x70, 0xFF, 0xD8, 0xB4, + 0x89, 0xBC, 0xB9, 0xA4, 0x8B, 0x41, 0x00, 0x24, 0x4C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC9, 0xAC, + 0x8E, 0x2C, 0xC0, 0x97, 0x73, 0xA9, 0xA4, 0x74, 0x49, 0xF6, 0x96, 0x5C, 0x2B, 0xFE, 0x87, 0x49, + 0x18, 0xFF, 0x81, 0x41, 0x0D, 0xFF, 0x81, 0x40, 0x0A, 0xFF, 0x83, 0x42, 0x0A, 0xFF, 0x86, 0x45, + 0x0A, 0xFF, 0x88, 0x48, 0x0B, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8F, 0x4F, + 0x0E, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x97, 0x56, + 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x99, 0x58, 0x11, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x99, 0x5A, + 0x13, 0xFF, 0x99, 0x5B, 0x15, 0xFF, 0x92, 0x5C, 0x19, 0xFF, 0x9C, 0x71, 0x38, 0xFF, 0xC1, 0xAE, + 0x94, 0xFF, 0xE9, 0xE7, 0xDE, 0xFF, 0xED, 0xEE, 0xEF, 0xFF, 0xEC, 0xEE, 0xEE, 0xFF, 0xEB, 0xED, + 0xEE, 0xFF, 0xEC, 0xED, 0xEE, 0xFF, 0xEC, 0xEE, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xEE, + 0xED, 0xFF, 0xED, 0xED, 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, 0xED, 0xFF, 0xEC, 0xED, + 0xED, 0xFF, 0xEC, 0xED, 0xED, 0xFF, 0xEC, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xF0, 0xF1, + 0xF1, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xF0, 0xF0, 0xF2, 0xFF, 0xEF, 0xF0, + 0xF2, 0xFF, 0xF0, 0xF0, 0xF1, 0xFF, 0xEF, 0xF0, 0xF2, 0xFF, 0xEA, 0xEC, 0xED, 0xFF, 0xD0, 0xD0, + 0xCB, 0xFF, 0x99, 0x8F, 0x78, 0xFF, 0x7C, 0x67, 0x45, 0xFF, 0x74, 0x5E, 0x38, 0xFF, 0x8C, 0x78, + 0x5A, 0xFF, 0xC6, 0xBC, 0xAE, 0xFF, 0xE2, 0xE2, 0xDF, 0xFF, 0xE0, 0xE0, 0xDF, 0xFF, 0xCC, 0xC5, + 0xBC, 0xFF, 0xA1, 0x8F, 0x77, 0xFF, 0x7F, 0x62, 0x39, 0xFF, 0x78, 0x53, 0x21, 0xFF, 0x7E, 0x52, + 0x1A, 0xFF, 0x85, 0x53, 0x17, 0xFF, 0x8E, 0x58, 0x18, 0xFF, 0x95, 0x5A, 0x19, 0xFF, 0x99, 0x5D, + 0x18, 0xFF, 0x9D, 0x5F, 0x19, 0xFF, 0x9E, 0x60, 0x1A, 0xFF, 0x9F, 0x60, 0x1A, 0xFF, 0x9F, 0x60, + 0x1A, 0xFF, 0xA0, 0x60, 0x1A, 0xFF, 0x9F, 0x60, 0x1A, 0xFF, 0xA0, 0x60, 0x1A, 0xFF, 0x9F, 0x60, + 0x1A, 0xFF, 0x9F, 0x60, 0x1A, 0xFF, 0x9F, 0x60, 0x1A, 0xFF, 0x9F, 0x60, 0x1A, 0xFF, 0x9F, 0x60, + 0x19, 0xFF, 0x9F, 0x60, 0x19, 0xFF, 0x9F, 0x60, 0x19, 0xFF, 0xA0, 0x60, 0x19, 0xFF, 0x9F, 0x60, + 0x19, 0xFF, 0xA0, 0x60, 0x19, 0xFF, 0x9F, 0x60, 0x18, 0xFF, 0x9F, 0x5F, 0x17, 0xFF, 0x9E, 0x5E, + 0x17, 0xFF, 0x9E, 0x5C, 0x15, 0xFF, 0x9C, 0x5B, 0x13, 0xFF, 0x9C, 0x5A, 0x12, 0xFF, 0x9B, 0x5A, + 0x11, 0xFF, 0x9C, 0x5B, 0x11, 0xFF, 0x9B, 0x5A, 0x11, 0xFF, 0x9B, 0x5A, 0x11, 0xFF, 0x9B, 0x5A, + 0x11, 0xFF, 0x9B, 0x59, 0x11, 0xFF, 0x99, 0x59, 0x10, 0xFF, 0x99, 0x58, 0x10, 0xFF, 0x98, 0x57, + 0x10, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x98, 0x5A, 0x1B, 0xFF, 0xA2, 0x71, 0x3D, 0xFF, 0xB9, 0x8C, 0x61, 0xFF, 0xD4, 0xAC, + 0x81, 0xD9, 0xA8, 0x92, 0x71, 0x62, 0x03, 0x26, 0x4C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFD, 0x03, 0xCE, 0xB1, + 0x94, 0x45, 0xB3, 0x83, 0x56, 0xCB, 0xA2, 0x6E, 0x40, 0xFD, 0x93, 0x5A, 0x29, 0xFF, 0x85, 0x46, + 0x14, 0xFF, 0x82, 0x41, 0x0C, 0xFF, 0x83, 0x42, 0x0A, 0xFF, 0x85, 0x44, 0x0A, 0xFF, 0x88, 0x47, + 0x0B, 0xFF, 0x8A, 0x4A, 0x0C, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x99, 0x58, + 0x11, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x9C, 0x5B, 0x13, 0xFF, 0x9D, 0x5D, 0x15, 0xFF, 0x9D, 0x5F, + 0x17, 0xFF, 0x9D, 0x5F, 0x19, 0xFF, 0x99, 0x5D, 0x17, 0xFF, 0x97, 0x63, 0x20, 0xFF, 0xA3, 0x7A, + 0x48, 0xFF, 0xCD, 0xBF, 0xAD, 0xFF, 0xE8, 0xE8, 0xE2, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEB, 0xEC, + 0xEC, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xE9, 0xEB, 0xEB, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xEB, 0xEC, + 0xEC, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEC, 0xED, + 0xED, 0xFF, 0xEC, 0xED, 0xED, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, + 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEF, 0xF0, + 0xF0, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xEE, 0xF0, + 0xF0, 0xFF, 0xEE, 0xEF, 0xF0, 0xFF, 0xEF, 0xF0, 0xF1, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xED, 0xEF, + 0xEF, 0xFF, 0xDA, 0xDA, 0xD7, 0xFF, 0xA9, 0xA0, 0x90, 0xFF, 0x80, 0x6D, 0x4B, 0xFF, 0x73, 0x60, + 0x39, 0xFF, 0x82, 0x6F, 0x4E, 0xFF, 0xB6, 0xAA, 0x96, 0xFF, 0xDF, 0xE0, 0xDB, 0xFF, 0xE1, 0xE2, + 0xE1, 0xFF, 0xD7, 0xD4, 0xCC, 0xFF, 0xB4, 0xA8, 0x93, 0xFF, 0x89, 0x71, 0x4A, 0xFF, 0x7C, 0x5B, + 0x2A, 0xFF, 0x7E, 0x56, 0x20, 0xFF, 0x84, 0x56, 0x1A, 0xFF, 0x8C, 0x58, 0x19, 0xFF, 0x94, 0x5C, + 0x1A, 0xFF, 0x9B, 0x5F, 0x1B, 0xFF, 0x9E, 0x60, 0x1A, 0xFF, 0x9F, 0x61, 0x1B, 0xFF, 0xA0, 0x61, + 0x1B, 0xFF, 0xA0, 0x61, 0x1B, 0xFF, 0xA1, 0x62, 0x1C, 0xFF, 0xA1, 0x62, 0x1C, 0xFF, 0xA1, 0x62, + 0x1C, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, + 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, + 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, + 0x1A, 0xFF, 0xA1, 0x61, 0x19, 0xFF, 0xA0, 0x60, 0x18, 0xFF, 0x9F, 0x5E, 0x16, 0xFF, 0x9E, 0x5D, + 0x13, 0xFF, 0x9D, 0x5C, 0x12, 0xFF, 0x9D, 0x5B, 0x11, 0xFF, 0x9D, 0x5B, 0x11, 0xFF, 0x9C, 0x5B, + 0x11, 0xFF, 0x9C, 0x5B, 0x11, 0xFF, 0x9B, 0x5B, 0x11, 0xFF, 0x9B, 0x5A, 0x11, 0xFF, 0x99, 0x58, + 0x10, 0xFF, 0x99, 0x58, 0x10, 0xFF, 0x97, 0x56, 0x0F, 0xFF, 0x96, 0x55, 0x0F, 0xFF, 0x94, 0x54, + 0x0F, 0xFF, 0x94, 0x55, 0x13, 0xFF, 0x9F, 0x67, 0x2D, 0xFF, 0xB3, 0x85, 0x56, 0xFF, 0xC5, 0x9F, + 0x75, 0xEC, 0xC5, 0xA7, 0x87, 0x7F, 0xC6, 0xB3, 0xA0, 0x1B, 0xA8, 0xA0, 0x96, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0xFF, 0x0B, 0xD7, 0xB8, + 0x9D, 0x5D, 0xAB, 0x7C, 0x4C, 0xE4, 0x9D, 0x69, 0x39, 0xFF, 0x92, 0x56, 0x25, 0xFF, 0x84, 0x44, + 0x10, 0xFF, 0x84, 0x43, 0x0C, 0xFF, 0x85, 0x43, 0x0A, 0xFF, 0x88, 0x47, 0x0B, 0xFF, 0x8A, 0x49, + 0x0C, 0xFF, 0x8D, 0x4C, 0x0C, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x93, 0x53, + 0x0F, 0xFF, 0x96, 0x55, 0x0F, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x9B, 0x5A, + 0x12, 0xFF, 0x9D, 0x5C, 0x14, 0xFF, 0x9E, 0x5F, 0x17, 0xFF, 0xA0, 0x61, 0x19, 0xFF, 0xA2, 0x63, + 0x1B, 0xFF, 0xA2, 0x64, 0x1C, 0xFF, 0x9F, 0x62, 0x1B, 0xFF, 0x9C, 0x61, 0x1D, 0xFF, 0x9A, 0x66, + 0x27, 0xFF, 0xAC, 0x89, 0x5C, 0xFF, 0xD3, 0xCB, 0xBC, 0xFF, 0xE8, 0xE8, 0xE5, 0xFF, 0xE9, 0xEA, + 0xEB, 0xFF, 0xE8, 0xEA, 0xEA, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE9, 0xEA, + 0xEA, 0xFF, 0xE9, 0xEA, 0xEA, 0xFF, 0xE9, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEB, + 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xEA, 0xEB, 0xEA, 0xFF, 0xEA, 0xEB, + 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xED, 0xEE, + 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xEE, 0xEE, 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xED, 0xEE, 0xEF, 0xFF, 0xEE, 0xEE, + 0xEF, 0xFF, 0xED, 0xEE, 0xEF, 0xFF, 0xE6, 0xE6, 0xE5, 0xFF, 0xBA, 0xB4, 0xA7, 0xFF, 0x81, 0x70, + 0x4E, 0xFF, 0x73, 0x5E, 0x36, 0xFF, 0x84, 0x70, 0x4B, 0xFF, 0xAA, 0x9C, 0x84, 0xFF, 0xD9, 0xD7, + 0xD0, 0xFF, 0xE5, 0xE6, 0xE5, 0xFF, 0xDF, 0xDB, 0xD8, 0xFF, 0xBF, 0xB6, 0xA7, 0xFF, 0x91, 0x7B, + 0x5A, 0xFF, 0x7F, 0x5F, 0x31, 0xFF, 0x7E, 0x56, 0x21, 0xFF, 0x83, 0x55, 0x1C, 0xFF, 0x8C, 0x58, + 0x1A, 0xFF, 0x95, 0x5C, 0x1C, 0xFF, 0x9A, 0x60, 0x1B, 0xFF, 0x9F, 0x62, 0x1B, 0xFF, 0xA0, 0x63, + 0x1C, 0xFF, 0xA1, 0x63, 0x1C, 0xFF, 0xA2, 0x64, 0x1D, 0xFF, 0xA3, 0x64, 0x1D, 0xFF, 0xA2, 0x64, + 0x1C, 0xFF, 0xA3, 0x63, 0x1C, 0xFF, 0xA2, 0x64, 0x1C, 0xFF, 0xA2, 0x64, 0x1B, 0xFF, 0xA2, 0x64, + 0x1C, 0xFF, 0xA3, 0x64, 0x1C, 0xFF, 0xA2, 0x64, 0x1C, 0xFF, 0xA3, 0x64, 0x1D, 0xFF, 0xA2, 0x63, + 0x1C, 0xFF, 0xA2, 0x63, 0x1D, 0xFF, 0xA2, 0x64, 0x1C, 0xFF, 0xA3, 0x64, 0x1C, 0xFF, 0xA2, 0x64, + 0x1C, 0xFF, 0xA3, 0x64, 0x1C, 0xFF, 0xA2, 0x63, 0x1B, 0xFF, 0xA2, 0x62, 0x1A, 0xFF, 0xA1, 0x61, + 0x18, 0xFF, 0xA0, 0x5E, 0x15, 0xFF, 0x9E, 0x5D, 0x12, 0xFF, 0x9E, 0x5C, 0x12, 0xFF, 0x9D, 0x5C, + 0x11, 0xFF, 0x9D, 0x5C, 0x11, 0xFF, 0x9C, 0x5C, 0x11, 0xFF, 0x9C, 0x5B, 0x11, 0xFF, 0x9B, 0x5A, + 0x10, 0xFF, 0x9A, 0x59, 0x10, 0xFF, 0x99, 0x58, 0x0F, 0xFF, 0x98, 0x57, 0x0F, 0xFF, 0x96, 0x56, + 0x10, 0xFF, 0x95, 0x56, 0x12, 0xFF, 0x9B, 0x5E, 0x1E, 0xFF, 0xAC, 0x7B, 0x49, 0xFF, 0xB8, 0x90, + 0x65, 0xF6, 0xC9, 0xAC, 0x8B, 0x9F, 0xDB, 0xC3, 0xA7, 0x29, 0xDB, 0xC2, 0xA9, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0xE0, 0xD4, 0x15, 0xCC, 0xAC, + 0x8D, 0x7C, 0xAD, 0x7D, 0x4D, 0xED, 0x9C, 0x66, 0x34, 0xFF, 0x8F, 0x51, 0x1C, 0xFF, 0x85, 0x44, + 0x0F, 0xFF, 0x86, 0x44, 0x0C, 0xFF, 0x88, 0x46, 0x0B, 0xFF, 0x8A, 0x49, 0x0B, 0xFF, 0x8C, 0x4C, + 0x0D, 0xFF, 0x8F, 0x4E, 0x0D, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x94, 0x52, 0x0E, 0xFF, 0x96, 0x54, + 0x0F, 0xFF, 0x98, 0x56, 0x10, 0xFF, 0x9A, 0x59, 0x12, 0xFF, 0x9C, 0x5C, 0x15, 0xFF, 0x9F, 0x60, + 0x18, 0xFF, 0xA1, 0x62, 0x1A, 0xFF, 0xA2, 0x64, 0x1C, 0xFF, 0xA3, 0x65, 0x1D, 0xFF, 0xA4, 0x65, + 0x1E, 0xFF, 0xA3, 0x65, 0x1E, 0xFF, 0xA2, 0x65, 0x1E, 0xFF, 0x9F, 0x63, 0x1E, 0xFF, 0x9B, 0x62, + 0x1E, 0xFF, 0x9B, 0x69, 0x2A, 0xFF, 0xB5, 0x95, 0x6E, 0xFF, 0xD9, 0xD3, 0xCA, 0xFF, 0xE8, 0xE8, + 0xE6, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE7, 0xE9, 0xE9, 0xFF, 0xE6, 0xE8, 0xE8, 0xFF, 0xE6, 0xE7, + 0xE7, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE7, 0xE8, 0xE8, 0xFF, 0xE7, 0xE8, 0xE8, 0xFF, 0xE7, 0xE8, + 0xE8, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE8, 0xE9, + 0xE9, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE9, 0xEA, + 0xE9, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEC, 0xED, + 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEC, 0xEE, 0xEE, 0xFF, 0xEC, 0xED, 0xED, 0xFF, 0xEC, 0xED, + 0xED, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEA, 0xEC, 0xEC, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xC8, 0xC5, + 0xBC, 0xFF, 0x89, 0x7B, 0x5F, 0xFF, 0x73, 0x61, 0x3B, 0xFF, 0x7D, 0x68, 0x43, 0xFF, 0x9B, 0x8A, + 0x6F, 0xFF, 0xD2, 0xCF, 0xC1, 0xFF, 0xE5, 0xE4, 0xE4, 0xFF, 0xE2, 0xE0, 0xDE, 0xFF, 0xCF, 0xCB, + 0xC0, 0xFF, 0xA2, 0x92, 0x7A, 0xFF, 0x87, 0x69, 0x3E, 0xFF, 0x7F, 0x5A, 0x26, 0xFF, 0x81, 0x57, + 0x1E, 0xFF, 0x89, 0x59, 0x1D, 0xFF, 0x93, 0x5E, 0x1D, 0xFF, 0x9B, 0x61, 0x1D, 0xFF, 0x9F, 0x63, + 0x1D, 0xFF, 0xA1, 0x64, 0x1D, 0xFF, 0xA2, 0x65, 0x1D, 0xFF, 0xA4, 0x65, 0x1E, 0xFF, 0xA4, 0x65, + 0x1E, 0xFF, 0xA4, 0x65, 0x1D, 0xFF, 0xA4, 0x65, 0x1D, 0xFF, 0xA4, 0x65, 0x1D, 0xFF, 0xA4, 0x65, + 0x1D, 0xFF, 0xA4, 0x65, 0x1D, 0xFF, 0xA4, 0x65, 0x1D, 0xFF, 0xA4, 0x65, 0x1E, 0xFF, 0xA4, 0x65, + 0x1E, 0xFF, 0xA4, 0x65, 0x1E, 0xFF, 0xA4, 0x65, 0x1E, 0xFF, 0xA4, 0x65, 0x1E, 0xFF, 0xA4, 0x65, + 0x1E, 0xFF, 0xA4, 0x65, 0x1E, 0xFF, 0xA4, 0x65, 0x1E, 0xFF, 0xA4, 0x65, 0x1E, 0xFF, 0xA4, 0x65, + 0x1D, 0xFF, 0xA3, 0x64, 0x1B, 0xFF, 0xA2, 0x62, 0x17, 0xFF, 0xA0, 0x60, 0x15, 0xFF, 0x9F, 0x5E, + 0x13, 0xFF, 0x9F, 0x5D, 0x13, 0xFF, 0x9E, 0x5D, 0x12, 0xFF, 0x9E, 0x5C, 0x12, 0xFF, 0x9D, 0x5C, + 0x11, 0xFF, 0x9C, 0x5B, 0x10, 0xFF, 0x9B, 0x5A, 0x11, 0xFF, 0x9A, 0x58, 0x11, 0xFF, 0x97, 0x56, + 0x0F, 0xFF, 0x96, 0x56, 0x11, 0xFF, 0x9A, 0x5C, 0x1B, 0xFF, 0xA9, 0x71, 0x3A, 0xFF, 0xB6, 0x87, + 0x58, 0xFB, 0xCC, 0xB0, 0x8B, 0xBB, 0xE0, 0xC6, 0xAC, 0x3A, 0xDF, 0xCA, 0xB2, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xC9, 0xAF, 0x25, 0xC8, 0xA6, + 0x81, 0x97, 0xAA, 0x78, 0x45, 0xF4, 0x9B, 0x61, 0x2F, 0xFF, 0x8C, 0x4D, 0x18, 0xFF, 0x87, 0x45, + 0x0F, 0xFF, 0x88, 0x45, 0x0C, 0xFF, 0x8A, 0x47, 0x0B, 0xFF, 0x8C, 0x4B, 0x0C, 0xFF, 0x8E, 0x4E, + 0x0D, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x93, 0x52, 0x0E, 0xFF, 0x96, 0x54, 0x0F, 0xFF, 0x98, 0x56, + 0x10, 0xFF, 0x9A, 0x59, 0x12, 0xFF, 0x9D, 0x5D, 0x16, 0xFF, 0xA0, 0x61, 0x1A, 0xFF, 0xA2, 0x64, + 0x1D, 0xFF, 0xA4, 0x66, 0x1F, 0xFF, 0xA4, 0x67, 0x1F, 0xFF, 0xA5, 0x67, 0x20, 0xFF, 0xA5, 0x67, + 0x20, 0xFF, 0xA5, 0x67, 0x20, 0xFF, 0xA5, 0x66, 0x1F, 0xFF, 0xA3, 0x66, 0x1F, 0xFF, 0x9F, 0x65, + 0x1D, 0xFF, 0x9B, 0x62, 0x1F, 0xFF, 0xA1, 0x72, 0x33, 0xFF, 0xBC, 0xA4, 0x86, 0xFF, 0xE0, 0xDC, + 0xD6, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE5, 0xE7, 0xE7, 0xFF, 0xE4, 0xE5, + 0xE5, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE5, 0xE6, + 0xE5, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE7, 0xE7, + 0xE7, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE7, 0xE8, 0xE7, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE6, 0xE7, + 0xE6, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE9, 0xEA, 0xEA, 0xFF, 0xEA, 0xEB, + 0xEB, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, + 0xEC, 0xFF, 0xEA, 0xEB, 0xEC, 0xFF, 0xEA, 0xEB, 0xEC, 0xFF, 0xEB, 0xEB, 0xED, 0xFF, 0xEB, 0xEA, + 0xEC, 0xFF, 0xD6, 0xD3, 0xCE, 0xFF, 0x93, 0x87, 0x6C, 0xFF, 0x7A, 0x66, 0x3F, 0xFF, 0x82, 0x6D, + 0x45, 0xFF, 0x92, 0x7F, 0x5E, 0xFF, 0xC7, 0xC0, 0xB0, 0xFF, 0xE6, 0xE3, 0xE2, 0xFF, 0xE4, 0xE0, + 0xE1, 0xFF, 0xD7, 0xD3, 0xCC, 0xFF, 0xB0, 0xA4, 0x90, 0xFF, 0x8E, 0x74, 0x4E, 0xFF, 0x80, 0x5D, + 0x2D, 0xFF, 0x7F, 0x57, 0x20, 0xFF, 0x87, 0x5A, 0x1E, 0xFF, 0x91, 0x5D, 0x1E, 0xFF, 0x98, 0x61, + 0x1E, 0xFF, 0x9E, 0x63, 0x1E, 0xFF, 0xA1, 0x66, 0x1E, 0xFF, 0xA4, 0x66, 0x1E, 0xFF, 0xA5, 0x67, + 0x1F, 0xFF, 0xA6, 0x66, 0x1F, 0xFF, 0xA5, 0x66, 0x1F, 0xFF, 0xA6, 0x66, 0x1F, 0xFF, 0xA5, 0x67, + 0x1F, 0xFF, 0xA6, 0x67, 0x1F, 0xFF, 0xA5, 0x67, 0x1F, 0xFF, 0xA5, 0x67, 0x1F, 0xFF, 0xA5, 0x67, + 0x1F, 0xFF, 0xA6, 0x67, 0x1F, 0xFF, 0xA5, 0x67, 0x1F, 0xFF, 0xA5, 0x67, 0x1F, 0xFF, 0xA5, 0x67, + 0x1F, 0xFF, 0xA6, 0x67, 0x20, 0xFF, 0xA5, 0x67, 0x1F, 0xFF, 0xA5, 0x67, 0x20, 0xFF, 0xA5, 0x67, + 0x20, 0xFF, 0xA6, 0x67, 0x1F, 0xFF, 0xA5, 0x66, 0x1D, 0xFF, 0xA4, 0x64, 0x1A, 0xFF, 0xA2, 0x62, + 0x17, 0xFF, 0xA1, 0x5F, 0x14, 0xFF, 0x9F, 0x5E, 0x13, 0xFF, 0xA0, 0x5D, 0x12, 0xFF, 0x9E, 0x5D, + 0x11, 0xFF, 0x9E, 0x5C, 0x11, 0xFF, 0x9C, 0x5B, 0x11, 0xFF, 0x9B, 0x59, 0x11, 0xFF, 0x99, 0x57, + 0x0F, 0xFF, 0x97, 0x56, 0x0F, 0xFF, 0x98, 0x5A, 0x17, 0xFF, 0xA7, 0x6C, 0x31, 0xFF, 0xB4, 0x80, + 0x4D, 0xFD, 0xC8, 0xAA, 0x85, 0xCC, 0xDD, 0xC8, 0xB0, 0x50, 0xE0, 0xCA, 0xB4, 0x0A, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xC9, 0xB0, 0x03, 0xDB, 0xC1, 0xA5, 0x2F, 0xC0, 0x9E, + 0x7A, 0xB0, 0xAA, 0x75, 0x40, 0xF8, 0x9A, 0x5F, 0x2C, 0xFF, 0x8D, 0x4D, 0x17, 0xFF, 0x88, 0x46, + 0x0D, 0xFF, 0x8A, 0x47, 0x0B, 0xFF, 0x8C, 0x49, 0x0C, 0xFF, 0x8E, 0x4D, 0x0D, 0xFF, 0x90, 0x4F, + 0x0E, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x96, 0x54, 0x0F, 0xFF, 0x99, 0x57, 0x11, 0xFF, 0x9B, 0x5A, + 0x14, 0xFF, 0x9F, 0x5F, 0x19, 0xFF, 0xA2, 0x64, 0x1D, 0xFF, 0xA4, 0x66, 0x1F, 0xFF, 0xA5, 0x68, + 0x21, 0xFF, 0xA6, 0x68, 0x21, 0xFF, 0xA7, 0x69, 0x22, 0xFF, 0xA7, 0x69, 0x22, 0xFF, 0xA7, 0x69, + 0x22, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA6, 0x68, 0x21, 0xFF, 0xA3, 0x67, + 0x20, 0xFF, 0xA0, 0x66, 0x20, 0xFF, 0x9A, 0x64, 0x22, 0xFF, 0xA2, 0x7A, 0x41, 0xFF, 0xC3, 0xB1, + 0x9A, 0xFF, 0xDE, 0xDD, 0xD9, 0xFF, 0xE6, 0xE5, 0xE4, 0xFF, 0xE4, 0xE5, 0xE6, 0xFF, 0xE3, 0xE5, + 0xE4, 0xFF, 0xE2, 0xE4, 0xE4, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE2, 0xE3, + 0xE3, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE3, 0xE4, 0xE4, 0xFF, 0xE3, 0xE4, + 0xE4, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, + 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE6, 0xE7, + 0xE7, 0xFF, 0xE7, 0xE9, 0xE9, 0xFF, 0xE8, 0xEA, 0xEA, 0xFF, 0xE9, 0xEA, 0xEA, 0xFF, 0xE9, 0xEA, + 0xEB, 0xFF, 0xE9, 0xEA, 0xEA, 0xFF, 0xE9, 0xEA, 0xEB, 0xFF, 0xE8, 0xE9, 0xEA, 0xFF, 0xE8, 0xE9, + 0xE9, 0xFF, 0xEA, 0xE9, 0xEB, 0xFF, 0xDF, 0xDE, 0xD9, 0xFF, 0xA3, 0x99, 0x86, 0xFF, 0x7C, 0x6A, + 0x48, 0xFF, 0x7E, 0x6A, 0x43, 0xFF, 0x85, 0x71, 0x4E, 0xFF, 0xBC, 0xB1, 0x9D, 0xFF, 0xE1, 0xDE, + 0xDA, 0xFF, 0xE7, 0xE4, 0xE3, 0xFF, 0xDA, 0xD8, 0xD4, 0xFF, 0xC2, 0xBA, 0xAE, 0xFF, 0x9B, 0x84, + 0x64, 0xFF, 0x82, 0x63, 0x33, 0xFF, 0x7F, 0x5A, 0x23, 0xFF, 0x85, 0x5C, 0x21, 0xFF, 0x90, 0x5E, + 0x1F, 0xFF, 0x98, 0x61, 0x1E, 0xFF, 0x9E, 0x65, 0x1F, 0xFF, 0xA2, 0x67, 0x20, 0xFF, 0xA5, 0x68, + 0x20, 0xFF, 0xA7, 0x68, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, + 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, + 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, + 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x22, 0xFF, 0xA7, 0x69, + 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x68, 0x20, 0xFF, 0xA6, 0x68, + 0x1E, 0xFF, 0xA4, 0x65, 0x1A, 0xFF, 0xA2, 0x62, 0x16, 0xFF, 0xA1, 0x5F, 0x13, 0xFF, 0x9F, 0x5E, + 0x12, 0xFF, 0x9F, 0x5C, 0x11, 0xFF, 0x9E, 0x5B, 0x11, 0xFF, 0x9D, 0x5B, 0x11, 0xFF, 0x9B, 0x59, + 0x10, 0xFF, 0x99, 0x58, 0x10, 0xFF, 0x98, 0x59, 0x15, 0xFF, 0xA7, 0x6B, 0x2E, 0xFF, 0xB2, 0x7B, + 0x46, 0xFF, 0xC5, 0xA4, 0x7B, 0xD9, 0xDC, 0xC5, 0xAB, 0x69, 0xDF, 0xC9, 0xB0, 0x11, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD9, 0xC3, 0xA8, 0x04, 0xD7, 0xBD, 0xA2, 0x3D, 0xBC, 0x9A, + 0x74, 0xC4, 0xA8, 0x71, 0x3A, 0xFD, 0x98, 0x5C, 0x28, 0xFF, 0x8D, 0x4C, 0x15, 0xFF, 0x8A, 0x48, + 0x0D, 0xFF, 0x8B, 0x48, 0x0B, 0xFF, 0x8D, 0x4B, 0x0C, 0xFF, 0x90, 0x4E, 0x0D, 0xFF, 0x92, 0x51, + 0x0E, 0xFF, 0x95, 0x53, 0x0F, 0xFF, 0x99, 0x57, 0x12, 0xFF, 0x9C, 0x5B, 0x15, 0xFF, 0xA0, 0x61, + 0x1B, 0xFF, 0xA3, 0x65, 0x1F, 0xFF, 0xA5, 0x68, 0x21, 0xFF, 0xA7, 0x69, 0x22, 0xFF, 0xA7, 0x6A, + 0x22, 0xFF, 0xA8, 0x6A, 0x23, 0xFF, 0xA8, 0x6B, 0x23, 0xFF, 0xA9, 0x6B, 0x23, 0xFF, 0xA9, 0x6B, + 0x23, 0xFF, 0xA9, 0x6B, 0x23, 0xFF, 0xA9, 0x6B, 0x23, 0xFF, 0xA8, 0x6B, 0x22, 0xFF, 0xA7, 0x6A, + 0x22, 0xFF, 0xA5, 0x69, 0x21, 0xFF, 0x9F, 0x67, 0x20, 0xFF, 0x9C, 0x69, 0x25, 0xFF, 0xAA, 0x83, + 0x4D, 0xFF, 0xC9, 0xBC, 0xAD, 0xFF, 0xE1, 0xE0, 0xDE, 0xFF, 0xE3, 0xE4, 0xE5, 0xFF, 0xE2, 0xE3, + 0xE3, 0xFF, 0xE1, 0xE3, 0xE3, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xE0, 0xE1, + 0xE1, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xE1, 0xE2, + 0xE2, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE1, 0xE2, + 0xE2, 0xFF, 0xE1, 0xE1, 0xE2, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xE1, 0xE3, 0xE2, 0xFF, 0xE2, 0xE4, + 0xE4, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE6, 0xE8, 0xE7, 0xFF, 0xE6, 0xE8, 0xE8, 0xFF, 0xE7, 0xE8, + 0xE8, 0xFF, 0xE7, 0xE8, 0xE9, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE8, 0xE8, 0xEA, 0xFF, 0xE8, 0xE8, + 0xE8, 0xFF, 0xE8, 0xE7, 0xE8, 0xFF, 0xEB, 0xE8, 0xEB, 0xFF, 0xE2, 0xE0, 0xDE, 0xFF, 0xB1, 0xA9, + 0x96, 0xFF, 0x83, 0x72, 0x50, 0xFF, 0x7F, 0x69, 0x42, 0xFF, 0x83, 0x6E, 0x48, 0xFF, 0xB0, 0xA5, + 0x8F, 0xFF, 0xDD, 0xD9, 0xD5, 0xFF, 0xE2, 0xE1, 0xE1, 0xFF, 0xDC, 0xDB, 0xD9, 0xFF, 0xCC, 0xC5, + 0xBB, 0xFF, 0xA4, 0x92, 0x76, 0xFF, 0x85, 0x69, 0x3D, 0xFF, 0x7E, 0x5C, 0x27, 0xFF, 0x86, 0x5C, + 0x22, 0xFF, 0x8E, 0x5D, 0x1F, 0xFF, 0x97, 0x62, 0x21, 0xFF, 0x9E, 0x65, 0x22, 0xFF, 0xA4, 0x69, + 0x21, 0xFF, 0xA7, 0x6A, 0x22, 0xFF, 0xA8, 0x6B, 0x22, 0xFF, 0xA9, 0x6B, 0x23, 0xFF, 0xA8, 0x6B, + 0x23, 0xFF, 0xA9, 0x6B, 0x23, 0xFF, 0xA8, 0x6B, 0x23, 0xFF, 0xA8, 0x6B, 0x23, 0xFF, 0xA8, 0x6B, + 0x22, 0xFF, 0xA9, 0x6B, 0x22, 0xFF, 0xA8, 0x6B, 0x23, 0xFF, 0xA9, 0x6B, 0x23, 0xFF, 0xA8, 0x6B, + 0x22, 0xFF, 0xA9, 0x6B, 0x23, 0xFF, 0xA9, 0x6B, 0x23, 0xFF, 0xA9, 0x6B, 0x23, 0xFF, 0xA8, 0x6B, + 0x23, 0xFF, 0xA8, 0x6B, 0x23, 0xFF, 0xA8, 0x6B, 0x23, 0xFF, 0xA9, 0x6B, 0x23, 0xFF, 0xA9, 0x6B, + 0x22, 0xFF, 0xA8, 0x6A, 0x21, 0xFF, 0xA7, 0x67, 0x1C, 0xFF, 0xA4, 0x63, 0x17, 0xFF, 0xA1, 0x60, + 0x14, 0xFF, 0xA0, 0x5E, 0x12, 0xFF, 0x9F, 0x5C, 0x11, 0xFF, 0x9E, 0x5C, 0x11, 0xFF, 0x9C, 0x5A, + 0x10, 0xFF, 0x9B, 0x5A, 0x10, 0xFF, 0x9C, 0x5D, 0x15, 0xFF, 0xA3, 0x66, 0x28, 0xFF, 0xB2, 0x7A, + 0x42, 0xFF, 0xC4, 0x9F, 0x76, 0xE4, 0xDA, 0xC0, 0xA4, 0x82, 0xDD, 0xC4, 0xAA, 0x17, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0xBE, 0xA3, 0x06, 0xD5, 0xBA, 0x9D, 0x4F, 0xBC, 0x98, + 0x70, 0xD8, 0xA7, 0x6E, 0x38, 0xFD, 0x96, 0x58, 0x23, 0xFF, 0x8E, 0x4D, 0x14, 0xFF, 0x8C, 0x49, + 0x0E, 0xFF, 0x8D, 0x49, 0x0B, 0xFF, 0x90, 0x4D, 0x0D, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x99, 0x58, 0x13, 0xFF, 0x9D, 0x5D, 0x18, 0xFF, 0xA1, 0x62, 0x1D, 0xFF, 0xA4, 0x67, + 0x21, 0xFF, 0xA6, 0x69, 0x23, 0xFF, 0xA8, 0x6A, 0x24, 0xFF, 0xA9, 0x6C, 0x24, 0xFF, 0xAA, 0x6D, + 0x25, 0xFF, 0xAA, 0x6D, 0x25, 0xFF, 0xAA, 0x6D, 0x25, 0xFF, 0xAA, 0x6D, 0x25, 0xFF, 0xAB, 0x6D, + 0x25, 0xFF, 0xAB, 0x6D, 0x25, 0xFF, 0xAB, 0x6D, 0x24, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAA, 0x6D, + 0x24, 0xFF, 0xA9, 0x6D, 0x24, 0xFF, 0xA6, 0x6B, 0x23, 0xFF, 0xA0, 0x68, 0x22, 0xFF, 0x9C, 0x6C, + 0x2A, 0xFF, 0xAD, 0x8E, 0x63, 0xFF, 0xD0, 0xC7, 0xBB, 0xFF, 0xE1, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, + 0xE0, 0xFF, 0xDF, 0xE1, 0xE0, 0xFF, 0xDE, 0xE0, 0xE0, 0xFF, 0xDE, 0xDF, 0xDF, 0xFF, 0xDE, 0xDF, + 0xDF, 0xFF, 0xDE, 0xDF, 0xDF, 0xFF, 0xDE, 0xDF, 0xDF, 0xFF, 0xDE, 0xDF, 0xDF, 0xFF, 0xDE, 0xDF, + 0xDF, 0xFF, 0xDE, 0xDF, 0xDF, 0xFF, 0xDE, 0xDF, 0xDF, 0xFF, 0xDE, 0xDF, 0xE0, 0xFF, 0xDE, 0xDF, + 0xE0, 0xFF, 0xDE, 0xDF, 0xDF, 0xFF, 0xDE, 0xDF, 0xDF, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xE0, 0xE1, + 0xE1, 0xFF, 0xE1, 0xE2, 0xE1, 0xFF, 0xE2, 0xE3, 0xE2, 0xFF, 0xE4, 0xE6, 0xE5, 0xFF, 0xE3, 0xE6, + 0xE6, 0xFF, 0xE4, 0xE6, 0xE6, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE6, 0xE7, + 0xE7, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE6, 0xE6, 0xE7, 0xFF, 0xE8, 0xE7, 0xEA, 0xFF, 0xE4, 0xE4, + 0xE4, 0xFF, 0xBF, 0xB9, 0xAE, 0xFF, 0x8F, 0x7D, 0x5C, 0xFF, 0x82, 0x6B, 0x42, 0xFF, 0x7D, 0x68, + 0x41, 0xFF, 0xA1, 0x94, 0x7A, 0xFF, 0xD7, 0xD3, 0xCB, 0xFF, 0xE2, 0xE1, 0xE1, 0xFF, 0xDD, 0xDD, + 0xDC, 0xFF, 0xD3, 0xCF, 0xC9, 0xFF, 0xB5, 0xA7, 0x91, 0xFF, 0x8E, 0x76, 0x4F, 0xFF, 0x81, 0x62, + 0x2F, 0xFF, 0x85, 0x5F, 0x27, 0xFF, 0x8E, 0x60, 0x23, 0xFF, 0x96, 0x63, 0x22, 0xFF, 0x9F, 0x68, + 0x23, 0xFF, 0xA5, 0x6C, 0x24, 0xFF, 0xA8, 0x6C, 0x24, 0xFF, 0xA9, 0x6C, 0x24, 0xFF, 0xAA, 0x6D, + 0x24, 0xFF, 0xAA, 0x6D, 0x25, 0xFF, 0xAA, 0x6D, 0x25, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAA, 0x6D, + 0x24, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAB, 0x6D, 0x24, 0xFF, 0xAB, 0x6D, + 0x24, 0xFF, 0xAB, 0x6D, 0x24, 0xFF, 0xAB, 0x6D, 0x24, 0xFF, 0xAB, 0x6D, 0x24, 0xFF, 0xAA, 0x6D, + 0x24, 0xFF, 0xAA, 0x6D, 0x25, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAB, 0x6D, 0x25, 0xFF, 0xAA, 0x6E, + 0x25, 0xFF, 0xAA, 0x6D, 0x25, 0xFF, 0xAA, 0x6C, 0x23, 0xFF, 0xA9, 0x6A, 0x20, 0xFF, 0xA6, 0x66, + 0x1A, 0xFF, 0xA3, 0x62, 0x15, 0xFF, 0xA1, 0x5F, 0x12, 0xFF, 0xA0, 0x5E, 0x11, 0xFF, 0x9F, 0x5D, + 0x11, 0xFF, 0x9D, 0x5C, 0x12, 0xFF, 0x9E, 0x5F, 0x17, 0xFF, 0xA3, 0x66, 0x23, 0xFF, 0xAF, 0x77, + 0x3D, 0xFF, 0xC3, 0x9D, 0x72, 0xEA, 0xD6, 0xB9, 0x99, 0x95, 0xD9, 0xBF, 0xA1, 0x1E, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0xBD, 0xA1, 0x0A, 0xD6, 0xBA, 0x9C, 0x62, 0xBB, 0x95, + 0x6B, 0xDE, 0xA4, 0x69, 0x33, 0xFD, 0x96, 0x57, 0x1F, 0xFF, 0x8E, 0x4D, 0x13, 0xFF, 0x8E, 0x4B, + 0x0D, 0xFF, 0x8F, 0x4B, 0x0C, 0xFF, 0x92, 0x4F, 0x0D, 0xFF, 0x94, 0x52, 0x0F, 0xFF, 0x98, 0x58, + 0x13, 0xFF, 0x9D, 0x5D, 0x19, 0xFF, 0xA2, 0x63, 0x1F, 0xFF, 0xA5, 0x68, 0x23, 0xFF, 0xA6, 0x6A, + 0x25, 0xFF, 0xA9, 0x6C, 0x25, 0xFF, 0xA9, 0x6C, 0x25, 0xFF, 0xAB, 0x6D, 0x26, 0xFF, 0xAB, 0x6F, + 0x26, 0xFF, 0xAC, 0x6F, 0x26, 0xFF, 0xAB, 0x6F, 0x26, 0xFF, 0xAC, 0x6F, 0x26, 0xFF, 0xAC, 0x6F, + 0x26, 0xFF, 0xAD, 0x6F, 0x26, 0xFF, 0xAC, 0x6F, 0x26, 0xFF, 0xAD, 0x6F, 0x26, 0xFF, 0xAC, 0x6F, + 0x26, 0xFF, 0xAB, 0x6F, 0x26, 0xFF, 0xAA, 0x6D, 0x25, 0xFF, 0xA8, 0x6C, 0x25, 0xFF, 0xA1, 0x6A, + 0x25, 0xFF, 0xA1, 0x73, 0x32, 0xFF, 0xB2, 0x97, 0x71, 0xFF, 0xD4, 0xCD, 0xC5, 0xFF, 0xDF, 0xDF, + 0xDE, 0xFF, 0xDF, 0xE0, 0xE1, 0xFF, 0xDC, 0xDD, 0xDE, 0xFF, 0xDC, 0xDE, 0xDE, 0xFF, 0xDC, 0xDD, + 0xDD, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDC, 0xDD, + 0xDD, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDB, 0xDD, 0xDE, 0xFF, 0xDC, 0xDD, 0xDE, 0xFF, 0xDC, 0xDE, + 0xDE, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDF, 0xDF, + 0xDF, 0xFF, 0xDF, 0xDE, 0xDC, 0xFF, 0xDE, 0xDE, 0xDD, 0xFF, 0xE2, 0xE3, 0xE2, 0xFF, 0xE0, 0xE1, + 0xE1, 0xFF, 0xE1, 0xE3, 0xE3, 0xFF, 0xE2, 0xE3, 0xE4, 0xFF, 0xE3, 0xE4, 0xE5, 0xFF, 0xE5, 0xE6, + 0xE6, 0xFF, 0xE6, 0xE6, 0xE7, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE4, 0xE4, 0xE5, 0xFF, 0xE5, 0xE4, + 0xE7, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xCB, 0xC9, 0xC1, 0xFF, 0x97, 0x8A, 0x6B, 0xFF, 0x7F, 0x6A, + 0x43, 0xFF, 0x7C, 0x67, 0x3E, 0xFF, 0x9A, 0x8A, 0x6C, 0xFF, 0xD2, 0xCA, 0xC0, 0xFF, 0xE0, 0xE0, + 0xDE, 0xFF, 0xDE, 0xDE, 0xDF, 0xFF, 0xD8, 0xD4, 0xD1, 0xFF, 0xBF, 0xB5, 0xA5, 0xFF, 0x94, 0x7F, + 0x5D, 0xFF, 0x82, 0x65, 0x36, 0xFF, 0x86, 0x5F, 0x2A, 0xFF, 0x8D, 0x60, 0x25, 0xFF, 0x95, 0x64, + 0x24, 0xFF, 0x9E, 0x68, 0x25, 0xFF, 0xA4, 0x6C, 0x25, 0xFF, 0xA9, 0x6E, 0x25, 0xFF, 0xAA, 0x6E, + 0x26, 0xFF, 0xAB, 0x6F, 0x25, 0xFF, 0xAB, 0x6F, 0x26, 0xFF, 0xAC, 0x6F, 0x26, 0xFF, 0xAB, 0x6F, + 0x25, 0xFF, 0xAC, 0x6E, 0x26, 0xFF, 0xAC, 0x6F, 0x26, 0xFF, 0xAD, 0x6F, 0x26, 0xFF, 0xAC, 0x6F, + 0x26, 0xFF, 0xAD, 0x6F, 0x26, 0xFF, 0xAC, 0x6F, 0x26, 0xFF, 0xAC, 0x6F, 0x26, 0xFF, 0xAB, 0x6F, + 0x26, 0xFF, 0xAC, 0x6F, 0x26, 0xFF, 0xAC, 0x6F, 0x26, 0xFF, 0xAD, 0x6F, 0x26, 0xFF, 0xAC, 0x6F, + 0x27, 0xFF, 0xAC, 0x6F, 0x27, 0xFF, 0xAC, 0x6F, 0x26, 0xFF, 0xAC, 0x6E, 0x26, 0xFF, 0xAA, 0x6C, + 0x22, 0xFF, 0xA7, 0x67, 0x1C, 0xFF, 0xA4, 0x63, 0x16, 0xFF, 0xA2, 0x60, 0x13, 0xFF, 0xA0, 0x5E, + 0x12, 0xFF, 0x9F, 0x5D, 0x12, 0xFF, 0x9F, 0x5F, 0x16, 0xFF, 0xA5, 0x67, 0x21, 0xFF, 0xAF, 0x77, + 0x38, 0xFF, 0xC2, 0x9A, 0x6F, 0xF3, 0xD3, 0xB5, 0x93, 0xA4, 0xD6, 0xB9, 0x9A, 0x24, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0xBE, 0xA1, 0x0E, 0xD7, 0xBC, 0x9D, 0x72, 0xBB, 0x96, + 0x6B, 0xE3, 0xA3, 0x67, 0x30, 0xFE, 0x97, 0x57, 0x1D, 0xFF, 0x90, 0x4F, 0x13, 0xFF, 0x90, 0x4C, + 0x0D, 0xFF, 0x91, 0x4D, 0x0C, 0xFF, 0x94, 0x50, 0x0E, 0xFF, 0x98, 0x57, 0x14, 0xFF, 0x9E, 0x5F, + 0x1C, 0xFF, 0xA2, 0x65, 0x22, 0xFF, 0xA5, 0x69, 0x25, 0xFF, 0xA7, 0x6B, 0x26, 0xFF, 0xA9, 0x6D, + 0x27, 0xFF, 0xAA, 0x6E, 0x27, 0xFF, 0xAB, 0x6E, 0x27, 0xFF, 0xAD, 0x6F, 0x28, 0xFF, 0xAD, 0x71, + 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, + 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, + 0x28, 0xFF, 0xAD, 0x71, 0x28, 0xFF, 0xAC, 0x70, 0x28, 0xFF, 0xAB, 0x70, 0x28, 0xFF, 0xA8, 0x6E, + 0x26, 0xFF, 0xA3, 0x6D, 0x28, 0xFF, 0xA1, 0x76, 0x3B, 0xFF, 0xB9, 0xA4, 0x88, 0xFF, 0xD5, 0xD0, + 0xC7, 0xFF, 0xDF, 0xDD, 0xDD, 0xFF, 0xDB, 0xDC, 0xDD, 0xFF, 0xD9, 0xDB, 0xDB, 0xFF, 0xD9, 0xDB, + 0xDB, 0xFF, 0xDA, 0xDB, 0xDB, 0xFF, 0xDA, 0xDB, 0xDB, 0xFF, 0xDA, 0xDB, 0xDB, 0xFF, 0xDA, 0xDB, + 0xDB, 0xFF, 0xDA, 0xDB, 0xDB, 0xFF, 0xDA, 0xDB, 0xDC, 0xFF, 0xDB, 0xDC, 0xDD, 0xFF, 0xDA, 0xDC, + 0xDD, 0xFF, 0xDA, 0xDB, 0xDB, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, 0xDB, 0xDB, 0xDA, 0xFF, 0xD4, 0xD0, + 0xCB, 0xFF, 0xC9, 0xC0, 0xB0, 0xFF, 0xC8, 0xC1, 0xAF, 0xFF, 0xD7, 0xD8, 0xD0, 0xFF, 0xDC, 0xDD, + 0xDD, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xDF, 0xE1, 0xE1, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE2, 0xE3, + 0xE4, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE5, 0xE5, 0xE6, 0xFF, 0xE4, 0xE4, + 0xE5, 0xFF, 0xE4, 0xE4, 0xE5, 0xFF, 0xE2, 0xE3, 0xE4, 0xFF, 0xD4, 0xD3, 0xCE, 0xFF, 0xA5, 0x99, + 0x7F, 0xFF, 0x81, 0x6D, 0x43, 0xFF, 0x7B, 0x69, 0x3E, 0xFF, 0x92, 0x81, 0x62, 0xFF, 0xC8, 0xBF, + 0xB0, 0xFF, 0xDA, 0xD9, 0xD5, 0xFF, 0xD9, 0xD9, 0xDA, 0xFF, 0xDA, 0xD8, 0xD7, 0xFF, 0xCC, 0xC7, + 0xBB, 0xFF, 0xA4, 0x95, 0x7B, 0xFF, 0x88, 0x6C, 0x42, 0xFF, 0x84, 0x61, 0x2D, 0xFF, 0x8B, 0x62, + 0x26, 0xFF, 0x93, 0x64, 0x25, 0xFF, 0x9E, 0x6A, 0x26, 0xFF, 0xA6, 0x6E, 0x27, 0xFF, 0xA9, 0x6F, + 0x27, 0xFF, 0xAB, 0x6F, 0x27, 0xFF, 0xAC, 0x71, 0x27, 0xFF, 0xAD, 0x71, 0x28, 0xFF, 0xAD, 0x71, + 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, + 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, + 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, + 0x28, 0xFF, 0xAE, 0x71, 0x29, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAD, 0x70, + 0x27, 0xFF, 0xAC, 0x6E, 0x25, 0xFF, 0xA9, 0x69, 0x1E, 0xFF, 0xA5, 0x63, 0x17, 0xFF, 0xA2, 0x60, + 0x12, 0xFF, 0xA1, 0x5F, 0x12, 0xFF, 0xA0, 0x61, 0x15, 0xFF, 0xA5, 0x67, 0x20, 0xFF, 0xAF, 0x77, + 0x33, 0xFF, 0xC0, 0x99, 0x6E, 0xF8, 0xD5, 0xB5, 0x93, 0xB6, 0xD5, 0xB7, 0x96, 0x28, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0xBE, 0xA0, 0x12, 0xD7, 0xBD, 0x9E, 0x7F, 0xBB, 0x95, + 0x69, 0xE4, 0xA2, 0x64, 0x2C, 0xFD, 0x97, 0x57, 0x1C, 0xFF, 0x92, 0x50, 0x13, 0xFF, 0x92, 0x4E, + 0x0D, 0xFF, 0x93, 0x4F, 0x0E, 0xFF, 0x97, 0x55, 0x13, 0xFF, 0x9D, 0x5E, 0x1C, 0xFF, 0xA2, 0x65, + 0x23, 0xFF, 0xA6, 0x6A, 0x27, 0xFF, 0xA7, 0x6C, 0x28, 0xFF, 0xAA, 0x6E, 0x28, 0xFF, 0xAB, 0x6E, + 0x29, 0xFF, 0xAC, 0x6F, 0x29, 0xFF, 0xAD, 0x70, 0x29, 0xFF, 0xAE, 0x71, 0x29, 0xFF, 0xAF, 0x73, + 0x2A, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xAF, 0x73, 0x2A, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xAF, 0x73, + 0x2A, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xAF, 0x73, 0x2A, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xAF, 0x73, + 0x2A, 0xFF, 0xAF, 0x73, 0x2A, 0xFF, 0xAF, 0x73, 0x2A, 0xFF, 0xAE, 0x72, 0x29, 0xFF, 0xAD, 0x71, + 0x29, 0xFF, 0xAA, 0x70, 0x29, 0xFF, 0xA4, 0x70, 0x2D, 0xFF, 0xA7, 0x81, 0x4A, 0xFF, 0xBD, 0xAD, + 0x96, 0xFF, 0xD4, 0xD1, 0xCD, 0xFF, 0xDB, 0xDB, 0xDC, 0xFF, 0xDA, 0xDB, 0xDC, 0xFF, 0xD7, 0xD9, + 0xD9, 0xFF, 0xD8, 0xD9, 0xD9, 0xFF, 0xD8, 0xD9, 0xD9, 0xFF, 0xD9, 0xD9, 0xD9, 0xFF, 0xD9, 0xDA, + 0xD9, 0xFF, 0xD9, 0xDA, 0xDA, 0xFF, 0xDA, 0xDB, 0xDB, 0xFF, 0xDB, 0xDC, 0xDC, 0xFF, 0xDA, 0xDB, + 0xDC, 0xFF, 0xD9, 0xDA, 0xDA, 0xFF, 0xD9, 0xDA, 0xD9, 0xFF, 0xD0, 0xCA, 0xBF, 0xFF, 0xA4, 0x93, + 0x76, 0xFF, 0x94, 0x7C, 0x52, 0xFF, 0x96, 0x7C, 0x4F, 0xFF, 0xBD, 0xAF, 0x96, 0xFF, 0xDB, 0xD9, + 0xD3, 0xFF, 0xDE, 0xDD, 0xDD, 0xFF, 0xDD, 0xDE, 0xE0, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xE0, 0xE1, + 0xE2, 0xFF, 0xE1, 0xE3, 0xE3, 0xFF, 0xE3, 0xE5, 0xE5, 0xFF, 0xE4, 0xE5, 0xE6, 0xFF, 0xE2, 0xE4, + 0xE5, 0xFF, 0xE2, 0xE3, 0xE4, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE1, 0xE3, 0xE3, 0xFF, 0xDC, 0xDC, + 0xDB, 0xFF, 0xB4, 0xAC, 0x98, 0xFF, 0x84, 0x71, 0x4B, 0xFF, 0x7D, 0x69, 0x3E, 0xFF, 0x95, 0x83, + 0x61, 0xFF, 0xC3, 0xB9, 0xA6, 0xFF, 0xD8, 0xD6, 0xD2, 0xFF, 0xDB, 0xDA, 0xDB, 0xFF, 0xDB, 0xD8, + 0xD8, 0xFF, 0xD2, 0xCD, 0xC7, 0xFF, 0xB2, 0xA6, 0x8F, 0xFF, 0x8F, 0x78, 0x51, 0xFF, 0x84, 0x64, + 0x32, 0xFF, 0x88, 0x61, 0x28, 0xFF, 0x92, 0x65, 0x27, 0xFF, 0x9D, 0x69, 0x28, 0xFF, 0xA4, 0x6D, + 0x28, 0xFF, 0xA9, 0x6F, 0x28, 0xFF, 0xAC, 0x72, 0x29, 0xFF, 0xAE, 0x72, 0x2A, 0xFF, 0xAF, 0x73, + 0x2A, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xAF, 0x73, 0x2A, 0xFF, 0xAF, 0x73, 0x2A, 0xFF, 0xAF, 0x73, + 0x29, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xAF, 0x73, 0x2A, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xAF, 0x73, + 0x29, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xAF, 0x73, 0x2A, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xAF, 0x73, + 0x2A, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xAF, 0x73, 0x2A, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xAF, 0x73, + 0x2A, 0xFF, 0xAF, 0x72, 0x2A, 0xFF, 0xAE, 0x70, 0x27, 0xFF, 0xAA, 0x6A, 0x1F, 0xFF, 0xA4, 0x62, + 0x15, 0xFF, 0xA3, 0x60, 0x14, 0xFF, 0xA2, 0x62, 0x16, 0xFF, 0xA6, 0x67, 0x1E, 0xFF, 0xB1, 0x77, + 0x30, 0xFF, 0xBF, 0x97, 0x6A, 0xFF, 0xD5, 0xB5, 0x92, 0xC5, 0xD6, 0xB7, 0x95, 0x29, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0xBD, 0xA0, 0x15, 0xD7, 0xBC, 0x9E, 0x87, 0xBE, 0x95, + 0x69, 0xE8, 0xA2, 0x64, 0x2B, 0xFF, 0x97, 0x56, 0x1A, 0xFF, 0x93, 0x50, 0x12, 0xFF, 0x94, 0x50, + 0x10, 0xFF, 0x97, 0x54, 0x13, 0xFF, 0x9E, 0x5F, 0x1E, 0xFF, 0xA2, 0x66, 0x25, 0xFF, 0xA6, 0x6A, + 0x28, 0xFF, 0xA8, 0x6D, 0x29, 0xFF, 0xAA, 0x6E, 0x2A, 0xFF, 0xAB, 0x70, 0x2A, 0xFF, 0xAD, 0x71, + 0x2A, 0xFF, 0xAE, 0x72, 0x2B, 0xFF, 0xAF, 0x73, 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB1, 0x75, + 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, + 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2C, 0xFF, 0xB1, 0x75, 0x2C, 0xFF, 0xB1, 0x75, + 0x2C, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB0, 0x75, 0x2B, 0xFF, 0xAF, 0x74, + 0x2B, 0xFF, 0xAD, 0x73, 0x2C, 0xFF, 0xAA, 0x71, 0x2B, 0xFF, 0xA4, 0x72, 0x2F, 0xFF, 0xA9, 0x86, + 0x54, 0xFF, 0xC3, 0xB6, 0xA6, 0xFF, 0xD3, 0xD3, 0xCE, 0xFF, 0xD9, 0xD8, 0xD9, 0xFF, 0xD7, 0xD7, + 0xD8, 0xFF, 0xD6, 0xD7, 0xD8, 0xFF, 0xD6, 0xD7, 0xD7, 0xFF, 0xD7, 0xD8, 0xD8, 0xFF, 0xD8, 0xD9, + 0xD9, 0xFF, 0xD9, 0xD9, 0xDA, 0xFF, 0xD9, 0xDA, 0xDB, 0xFF, 0xDA, 0xDB, 0xDC, 0xFF, 0xD8, 0xDA, + 0xDB, 0xFF, 0xD8, 0xDA, 0xDA, 0xFF, 0xD7, 0xD9, 0xD8, 0xFF, 0xB3, 0xA8, 0x95, 0xFF, 0x8B, 0x74, + 0x4D, 0xFF, 0x8A, 0x6F, 0x44, 0xFF, 0x8B, 0x6E, 0x40, 0xFF, 0xA6, 0x8C, 0x60, 0xFF, 0xD6, 0xCF, + 0xC5, 0xFF, 0xDB, 0xDA, 0xD9, 0xFF, 0xDC, 0xDD, 0xDE, 0xFF, 0xDF, 0xDF, 0xE0, 0xFF, 0xDE, 0xDF, + 0xE0, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xE3, 0xE3, 0xE4, 0xFF, 0xE3, 0xE4, 0xE5, 0xFF, 0xE2, 0xE3, + 0xE4, 0xFF, 0xE1, 0xE2, 0xE3, 0xFF, 0xE1, 0xE3, 0xE4, 0xFF, 0xE1, 0xE3, 0xE2, 0xFF, 0xE0, 0xE2, + 0xE1, 0xFF, 0xE0, 0xE1, 0xDF, 0xFF, 0xC1, 0xBB, 0xAE, 0xFF, 0x8C, 0x7C, 0x5A, 0xFF, 0x7F, 0x6F, + 0x47, 0xFF, 0x92, 0x82, 0x60, 0xFF, 0xB9, 0xAD, 0x98, 0xFF, 0xD5, 0xD4, 0xCC, 0xFF, 0xDA, 0xD9, + 0xDA, 0xFF, 0xDC, 0xDB, 0xDB, 0xFF, 0xD7, 0xD5, 0xD0, 0xFF, 0xC0, 0xB8, 0xA9, 0xFF, 0x9B, 0x85, + 0x64, 0xFF, 0x87, 0x69, 0x39, 0xFF, 0x89, 0x64, 0x2C, 0xFF, 0x91, 0x66, 0x2A, 0xFF, 0x9C, 0x6B, + 0x29, 0xFF, 0xA4, 0x6E, 0x29, 0xFF, 0xA9, 0x71, 0x2B, 0xFF, 0xAC, 0x73, 0x2B, 0xFF, 0xAF, 0x74, + 0x2B, 0xFF, 0xB1, 0x74, 0x2B, 0xFF, 0xB1, 0x74, 0x2B, 0xFF, 0xB1, 0x74, 0x2B, 0xFF, 0xB1, 0x75, + 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, + 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, + 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2C, 0xFF, 0xB1, 0x75, + 0x2C, 0xFF, 0xB1, 0x75, 0x2C, 0xFF, 0xB0, 0x74, 0x2C, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAA, 0x6A, + 0x20, 0xFF, 0xA5, 0x63, 0x17, 0xFF, 0xA3, 0x63, 0x17, 0xFF, 0xA5, 0x66, 0x1D, 0xFF, 0xB2, 0x75, + 0x2E, 0xFF, 0xC1, 0x97, 0x69, 0xFF, 0xD4, 0xB4, 0x91, 0xD7, 0xD5, 0xB6, 0x94, 0x27, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0xBE, 0xA0, 0x19, 0xD8, 0xBC, 0x9D, 0x8F, 0xBF, 0x95, + 0x66, 0xEA, 0xA2, 0x63, 0x29, 0xFE, 0x98, 0x56, 0x1A, 0xFF, 0x95, 0x52, 0x14, 0xFF, 0x98, 0x54, + 0x14, 0xFF, 0x9C, 0x5C, 0x1C, 0xFF, 0xA3, 0x66, 0x26, 0xFF, 0xA6, 0x6B, 0x2A, 0xFF, 0xA8, 0x6D, + 0x2B, 0xFF, 0xAB, 0x6F, 0x2B, 0xFF, 0xAC, 0x70, 0x2B, 0xFF, 0xAD, 0x71, 0x2C, 0xFF, 0xAF, 0x73, + 0x2C, 0xFF, 0xB0, 0x74, 0x2C, 0xFF, 0xB1, 0x75, 0x2D, 0xFF, 0xB2, 0x76, 0x2D, 0xFF, 0xB2, 0x77, + 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB2, 0x77, 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB2, 0x77, + 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB2, 0x77, 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB2, 0x77, + 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB2, 0x77, 0x2D, 0xFF, 0xB2, 0x77, 0x2D, 0xFF, 0xB2, 0x77, + 0x2D, 0xFF, 0xB1, 0x76, 0x2D, 0xFF, 0xAF, 0x75, 0x2C, 0xFF, 0xAB, 0x73, 0x2D, 0xFF, 0xA6, 0x75, + 0x33, 0xFF, 0xAF, 0x8F, 0x61, 0xFF, 0xC6, 0xBE, 0xB0, 0xFF, 0xD4, 0xD3, 0xCF, 0xFF, 0xD5, 0xD5, + 0xD6, 0xFF, 0xD5, 0xD6, 0xD7, 0xFF, 0xD5, 0xD6, 0xD6, 0xFF, 0xD6, 0xD7, 0xD7, 0xFF, 0xD7, 0xD8, + 0xD8, 0xFF, 0xD8, 0xD9, 0xD9, 0xFF, 0xD9, 0xDA, 0xDA, 0xFF, 0xD9, 0xDA, 0xDA, 0xFF, 0xD9, 0xDA, + 0xDA, 0xFF, 0xD9, 0xDB, 0xDB, 0xFF, 0xD7, 0xD9, 0xD5, 0xFF, 0xAB, 0xA1, 0x8A, 0xFF, 0x84, 0x6F, + 0x44, 0xFF, 0x8A, 0x6F, 0x42, 0xFF, 0x84, 0x68, 0x3B, 0xFF, 0x9A, 0x7C, 0x4C, 0xFF, 0xCF, 0xC3, + 0xB3, 0xFF, 0xDB, 0xDA, 0xD7, 0xFF, 0xDC, 0xDB, 0xDC, 0xFF, 0xDD, 0xDE, 0xE0, 0xFF, 0xDE, 0xDF, + 0xDF, 0xFF, 0xDE, 0xE0, 0xDF, 0xFF, 0xE1, 0xE3, 0xE2, 0xFF, 0xE3, 0xE3, 0xE4, 0xFF, 0xE1, 0xE2, + 0xE4, 0xFF, 0xE2, 0xE2, 0xE4, 0xFF, 0xE1, 0xE3, 0xE3, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE0, 0xE1, + 0xE0, 0xFF, 0xDF, 0xE1, 0xE2, 0xFF, 0xE0, 0xE1, 0xE2, 0xFF, 0xD0, 0xCC, 0xC5, 0xFF, 0x98, 0x8B, + 0x6D, 0xFF, 0x87, 0x76, 0x4F, 0xFF, 0x93, 0x82, 0x60, 0xFF, 0xB6, 0xA8, 0x91, 0xFF, 0xD1, 0xCE, + 0xC6, 0xFF, 0xDB, 0xDB, 0xDA, 0xFF, 0xDC, 0xDA, 0xDA, 0xFF, 0xD8, 0xD8, 0xD5, 0xFF, 0xCA, 0xC4, + 0xB8, 0xFF, 0xA4, 0x93, 0x76, 0xFF, 0x8A, 0x6F, 0x42, 0xFF, 0x87, 0x65, 0x2F, 0xFF, 0x91, 0x68, + 0x2C, 0xFF, 0x9B, 0x6B, 0x2A, 0xFF, 0xA2, 0x6F, 0x2B, 0xFF, 0xA9, 0x72, 0x2C, 0xFF, 0xAE, 0x75, + 0x2C, 0xFF, 0xB1, 0x76, 0x2C, 0xFF, 0xB2, 0x77, 0x2D, 0xFF, 0xB2, 0x76, 0x2D, 0xFF, 0xB2, 0x76, + 0x2D, 0xFF, 0xB2, 0x76, 0x2D, 0xFF, 0xB2, 0x77, 0x2D, 0xFF, 0xB2, 0x77, 0x2D, 0xFF, 0xB2, 0x77, + 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB2, 0x77, 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB2, 0x77, + 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB2, 0x77, 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB2, 0x77, + 0x2E, 0xFF, 0xB3, 0x77, 0x2E, 0xFF, 0xB2, 0x76, 0x2E, 0xFF, 0xB1, 0x75, 0x2D, 0xFF, 0xAF, 0x73, + 0x2A, 0xFF, 0xAB, 0x6C, 0x21, 0xFF, 0xA7, 0x67, 0x1C, 0xFF, 0xA7, 0x67, 0x1D, 0xFF, 0xAF, 0x72, + 0x2C, 0xFF, 0xC2, 0x98, 0x67, 0xFF, 0xD4, 0xB5, 0x91, 0xE4, 0xD6, 0xB6, 0x93, 0x23, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0xBE, 0x9F, 0x19, 0xD9, 0xBD, 0x9E, 0x94, 0xBF, 0x93, + 0x63, 0xED, 0xA3, 0x64, 0x29, 0xFF, 0x9B, 0x59, 0x1C, 0xFF, 0x98, 0x56, 0x18, 0xFF, 0x9D, 0x5D, + 0x1F, 0xFF, 0xA1, 0x65, 0x27, 0xFF, 0xA5, 0x6A, 0x2B, 0xFF, 0xA8, 0x6D, 0x2C, 0xFF, 0xAB, 0x6F, + 0x2C, 0xFF, 0xAD, 0x71, 0x2D, 0xFF, 0xAE, 0x72, 0x2D, 0xFF, 0xAF, 0x73, 0x2D, 0xFF, 0xB0, 0x75, + 0x2E, 0xFF, 0xB1, 0x76, 0x2E, 0xFF, 0xB2, 0x77, 0x2F, 0xFF, 0xB3, 0x78, 0x2F, 0xFF, 0xB4, 0x79, + 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, + 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, + 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, + 0x2F, 0xFF, 0xB3, 0x79, 0x2E, 0xFF, 0xB1, 0x78, 0x2E, 0xFF, 0xB0, 0x77, 0x30, 0xFF, 0xAA, 0x75, + 0x2E, 0xFF, 0xA7, 0x78, 0x35, 0xFF, 0xB1, 0x95, 0x70, 0xFF, 0xCB, 0xC5, 0xBC, 0xFF, 0xD5, 0xD6, + 0xD3, 0xFF, 0xD6, 0xD6, 0xD6, 0xFF, 0xD5, 0xD7, 0xD7, 0xFF, 0xD5, 0xD7, 0xD7, 0xFF, 0xD6, 0xD7, + 0xD7, 0xFF, 0xD6, 0xD7, 0xD7, 0xFF, 0xD7, 0xD8, 0xD8, 0xFF, 0xD7, 0xD8, 0xD8, 0xFF, 0xD7, 0xD8, + 0xD8, 0xFF, 0xD6, 0xD7, 0xD7, 0xFF, 0xD8, 0xD8, 0xD5, 0xFF, 0xCB, 0xC5, 0xB7, 0xFF, 0x99, 0x89, + 0x64, 0xFF, 0x85, 0x70, 0x43, 0xFF, 0x86, 0x6E, 0x41, 0xFF, 0x9A, 0x81, 0x5A, 0xFF, 0xC3, 0xB2, + 0x97, 0xFF, 0xD9, 0xD8, 0xD4, 0xFF, 0xDE, 0xDF, 0xE1, 0xFF, 0xDD, 0xDD, 0xD7, 0xFF, 0xDC, 0xDD, + 0xD8, 0xFF, 0xDD, 0xDB, 0xD5, 0xFF, 0xE1, 0xE0, 0xD9, 0xFF, 0xE2, 0xE2, 0xE1, 0xFF, 0xE2, 0xE3, + 0xE3, 0xFF, 0xE2, 0xE2, 0xDF, 0xFF, 0xE2, 0xE3, 0xE1, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE1, 0xE3, + 0xE3, 0xFF, 0xE0, 0xE2, 0xE2, 0xFF, 0xDE, 0xE0, 0xE0, 0xFF, 0xE1, 0xE0, 0xE0, 0xFF, 0xD3, 0xD1, + 0xCB, 0xFF, 0xA6, 0x9B, 0x85, 0xFF, 0x89, 0x7A, 0x58, 0xFF, 0x8F, 0x7E, 0x5E, 0xFF, 0xA7, 0x99, + 0x80, 0xFF, 0xD0, 0xCC, 0xC0, 0xFF, 0xDC, 0xDA, 0xD9, 0xFF, 0xDC, 0xDC, 0xDB, 0xFF, 0xDA, 0xDA, + 0xD8, 0xFF, 0xD1, 0xCE, 0xC8, 0xFF, 0xB3, 0xA5, 0x8F, 0xFF, 0x91, 0x79, 0x4E, 0xFF, 0x8A, 0x6A, + 0x34, 0xFF, 0x90, 0x6A, 0x2F, 0xFF, 0x99, 0x6C, 0x2C, 0xFF, 0xA2, 0x70, 0x2D, 0xFF, 0xAA, 0x74, + 0x2E, 0xFF, 0xB0, 0x77, 0x2F, 0xFF, 0xB2, 0x78, 0x2F, 0xFF, 0xB3, 0x78, 0x2F, 0xFF, 0xB4, 0x79, + 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, + 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, + 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, + 0x30, 0xFF, 0xB4, 0x79, 0x30, 0xFF, 0xB3, 0x78, 0x2F, 0xFF, 0xB2, 0x77, 0x2F, 0xFF, 0xB2, 0x77, + 0x2F, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xAC, 0x6E, 0x25, 0xFF, 0xAC, 0x6D, 0x24, 0xFF, 0xB0, 0x73, + 0x2E, 0xFF, 0xC2, 0x98, 0x66, 0xFF, 0xD5, 0xB5, 0x90, 0xEF, 0xD6, 0xB7, 0x92, 0x21, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD9, 0xBE, 0x9F, 0x1A, 0xD9, 0xBC, 0x9C, 0x96, 0xBF, 0x92, + 0x60, 0xED, 0xA4, 0x67, 0x2B, 0xFF, 0x9E, 0x5E, 0x21, 0xFF, 0x9C, 0x5C, 0x20, 0xFF, 0xA2, 0x65, + 0x28, 0xFF, 0xA5, 0x6A, 0x2C, 0xFF, 0xA7, 0x6C, 0x2D, 0xFF, 0xAB, 0x6F, 0x2E, 0xFF, 0xAC, 0x71, + 0x2E, 0xFF, 0xAF, 0x73, 0x2E, 0xFF, 0xB0, 0x74, 0x2F, 0xFF, 0xB1, 0x76, 0x2F, 0xFF, 0xB2, 0x77, + 0x30, 0xFF, 0xB3, 0x78, 0x30, 0xFF, 0xB4, 0x79, 0x31, 0xFF, 0xB5, 0x7A, 0x31, 0xFF, 0xB5, 0x7B, + 0x31, 0xFF, 0xB5, 0x7B, 0x31, 0xFF, 0xB5, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB5, 0x7B, + 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB5, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB5, 0x7B, + 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB5, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB5, 0x7B, + 0x31, 0xFF, 0xB5, 0x7B, 0x30, 0xFF, 0xB4, 0x7A, 0x30, 0xFF, 0xB3, 0x7A, 0x31, 0xFF, 0xAF, 0x78, + 0x30, 0xFF, 0xAD, 0x78, 0x32, 0xFF, 0xAB, 0x82, 0x45, 0xFF, 0xBA, 0xA5, 0x8B, 0xFF, 0xD1, 0xCD, + 0xC6, 0xFF, 0xD6, 0xD7, 0xD5, 0xFF, 0xD6, 0xD7, 0xD6, 0xFF, 0xD5, 0xD7, 0xD7, 0xFF, 0xD5, 0xD7, + 0xD6, 0xFF, 0xD6, 0xD7, 0xD7, 0xFF, 0xD6, 0xD7, 0xD7, 0xFF, 0xD6, 0xD7, 0xD7, 0xFF, 0xD7, 0xD7, + 0xD7, 0xFF, 0xD5, 0xD6, 0xD6, 0xFF, 0xD6, 0xD5, 0xD7, 0xFF, 0xDB, 0xDA, 0xDB, 0xFF, 0xCB, 0xC6, + 0xC2, 0xFF, 0xBC, 0xB8, 0xAE, 0xFF, 0xB8, 0xB4, 0x9F, 0xFF, 0xB6, 0xAC, 0x8E, 0xFF, 0xAD, 0x9D, + 0x77, 0xFF, 0xB5, 0xAB, 0x97, 0xFF, 0xC6, 0xBC, 0xA6, 0xFF, 0xC4, 0xB6, 0x96, 0xFF, 0xBA, 0xAB, + 0x8D, 0xFF, 0xB8, 0xA7, 0x91, 0xFF, 0xB7, 0xA6, 0x8F, 0xFF, 0xC1, 0xB4, 0xA2, 0xFF, 0xD2, 0xCC, + 0xC2, 0xFF, 0xDD, 0xDC, 0xD1, 0xFF, 0xDE, 0xDE, 0xD7, 0xFF, 0xE2, 0xE1, 0xDF, 0xFF, 0xE3, 0xE3, + 0xE2, 0xFF, 0xE2, 0xE3, 0xE4, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xDF, 0xDF, 0xE0, 0xFF, 0xE0, 0xDF, + 0xE0, 0xFF, 0xDA, 0xD8, 0xD2, 0xFF, 0xB3, 0xA9, 0x94, 0xFF, 0x93, 0x84, 0x63, 0xFF, 0x91, 0x81, + 0x5F, 0xFF, 0xA5, 0x97, 0x7B, 0xFF, 0xCD, 0xC8, 0xBC, 0xFF, 0xDC, 0xDB, 0xDA, 0xFF, 0xDB, 0xDD, + 0xDC, 0xFF, 0xD8, 0xD9, 0xD9, 0xFF, 0xD4, 0xD1, 0xCC, 0xFF, 0xBC, 0xB1, 0xA0, 0xFF, 0x98, 0x82, + 0x5B, 0xFF, 0x8B, 0x6C, 0x3A, 0xFF, 0x8F, 0x6A, 0x31, 0xFF, 0x98, 0x6C, 0x2E, 0xFF, 0xA2, 0x71, + 0x2F, 0xFF, 0xAA, 0x75, 0x30, 0xFF, 0xB0, 0x79, 0x31, 0xFF, 0xB4, 0x7A, 0x31, 0xFF, 0xB5, 0x7B, + 0x31, 0xFF, 0xB6, 0x7A, 0x31, 0xFF, 0xB5, 0x7A, 0x31, 0xFF, 0xB6, 0x7A, 0x31, 0xFF, 0xB5, 0x7B, + 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB5, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB5, 0x7B, + 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB5, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB5, 0x7B, + 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB4, 0x7A, 0x31, 0xFF, 0xB4, 0x79, 0x30, 0xFF, 0xB3, 0x78, + 0x30, 0xFF, 0xB2, 0x77, 0x2F, 0xFF, 0xB0, 0x74, 0x2C, 0xFF, 0xAF, 0x73, 0x2C, 0xFF, 0xB0, 0x75, + 0x31, 0xFF, 0xC3, 0x9B, 0x67, 0xFF, 0xD5, 0xB5, 0x90, 0xF2, 0xD6, 0xB7, 0x92, 0x1F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD9, 0xBE, 0x9F, 0x19, 0xD9, 0xBC, 0x9C, 0x95, 0xBD, 0x8F, + 0x5E, 0xEE, 0xA6, 0x6E, 0x34, 0xFF, 0xA3, 0x67, 0x2C, 0xFF, 0xA3, 0x66, 0x2C, 0xFF, 0xA6, 0x6A, + 0x2E, 0xFF, 0xA8, 0x6D, 0x2F, 0xFF, 0xAA, 0x6F, 0x2F, 0xFF, 0xAC, 0x72, 0x30, 0xFF, 0xAF, 0x74, + 0x31, 0xFF, 0xB0, 0x75, 0x31, 0xFF, 0xB2, 0x77, 0x32, 0xFF, 0xB3, 0x78, 0x32, 0xFF, 0xB4, 0x7A, + 0x32, 0xFF, 0xB5, 0x7B, 0x32, 0xFF, 0xB6, 0x7C, 0x33, 0xFF, 0xB7, 0x7C, 0x33, 0xFF, 0xB7, 0x7D, + 0x33, 0xFF, 0xB7, 0x7D, 0x33, 0xFF, 0xB7, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB7, 0x7D, + 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB7, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, + 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB7, 0x7D, + 0x33, 0xFF, 0xB7, 0x7D, 0x33, 0xFF, 0xB7, 0x7D, 0x33, 0xFF, 0xB6, 0x7D, 0x32, 0xFF, 0xB4, 0x7C, + 0x33, 0xFF, 0xB4, 0x7F, 0x3A, 0xFF, 0xB2, 0x83, 0x3F, 0xFF, 0xB3, 0x93, 0x63, 0xFF, 0xC2, 0xB3, + 0x9D, 0xFF, 0xD3, 0xD2, 0xCD, 0xFF, 0xD7, 0xD7, 0xD5, 0xFF, 0xD5, 0xD7, 0xD7, 0xFF, 0xD4, 0xD7, + 0xD7, 0xFF, 0xD5, 0xD7, 0xD7, 0xFF, 0xD5, 0xD7, 0xD7, 0xFF, 0xD6, 0xD7, 0xD7, 0xFF, 0xD6, 0xD7, + 0xD7, 0xFF, 0xD6, 0xD7, 0xD7, 0xFF, 0xD5, 0xD6, 0xD6, 0xFF, 0xD6, 0xD7, 0xD5, 0xFF, 0xD5, 0xD6, + 0xD4, 0xFF, 0xD9, 0xDA, 0xD9, 0xFF, 0xD9, 0xD9, 0xD8, 0xFF, 0xD1, 0xCE, 0xC3, 0xFF, 0xB1, 0x9F, + 0x7F, 0xFF, 0x9F, 0x89, 0x66, 0xFF, 0xA9, 0x98, 0x73, 0xFF, 0xB0, 0xA0, 0x80, 0xFF, 0xB7, 0xAA, + 0x8D, 0xFF, 0xC9, 0xC2, 0xAC, 0xFF, 0xBB, 0xAF, 0x96, 0xFF, 0xA9, 0x94, 0x73, 0xFF, 0xA1, 0x8B, + 0x69, 0xFF, 0xA6, 0x91, 0x70, 0xFF, 0xB2, 0xA5, 0x8B, 0xFF, 0xCC, 0xC7, 0xB9, 0xFF, 0xE4, 0xE2, + 0xE2, 0xFF, 0xE3, 0xE3, 0xE5, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xDF, 0xDF, + 0xE0, 0xFF, 0xE0, 0xDF, 0xDF, 0xFF, 0xDB, 0xDB, 0xD6, 0xFF, 0xBA, 0xB4, 0xA4, 0xFF, 0x9A, 0x8D, + 0x6F, 0xFF, 0x92, 0x82, 0x61, 0xFF, 0x9C, 0x8D, 0x6F, 0xFF, 0xC7, 0xC1, 0xB1, 0xFF, 0xDD, 0xDD, + 0xDA, 0xFF, 0xDC, 0xDC, 0xDD, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, 0xD9, 0xD7, 0xD5, 0xFF, 0xCD, 0xC5, + 0xB8, 0xFF, 0xA5, 0x92, 0x70, 0xFF, 0x8F, 0x72, 0x42, 0xFF, 0x8E, 0x6B, 0x34, 0xFF, 0x98, 0x6D, + 0x2F, 0xFF, 0xA1, 0x71, 0x2F, 0xFF, 0xAB, 0x77, 0x32, 0xFF, 0xB2, 0x7B, 0x33, 0xFF, 0xB5, 0x7C, + 0x33, 0xFF, 0xB6, 0x7C, 0x33, 0xFF, 0xB7, 0x7C, 0x33, 0xFF, 0xB7, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, + 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB7, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB7, 0x7D, + 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB7, 0x7D, + 0x33, 0xFF, 0xB7, 0x7D, 0x33, 0xFF, 0xB6, 0x7C, 0x33, 0xFF, 0xB6, 0x7B, 0x33, 0xFF, 0xB5, 0x7B, + 0x32, 0xFF, 0xB4, 0x7A, 0x32, 0xFF, 0xB3, 0x79, 0x32, 0xFF, 0xB5, 0x7C, 0x37, 0xFF, 0xB5, 0x7F, + 0x3C, 0xFF, 0xC6, 0x9E, 0x6B, 0xFF, 0xD5, 0xB5, 0x90, 0xF2, 0xD7, 0xB8, 0x94, 0x1F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDB, 0xC0, 0xA1, 0x15, 0xDA, 0xBD, 0x9D, 0x93, 0xBF, 0x93, + 0x62, 0xED, 0xAD, 0x76, 0x3E, 0xFF, 0xAA, 0x70, 0x38, 0xFF, 0xA8, 0x6C, 0x32, 0xFF, 0xA8, 0x6D, + 0x31, 0xFF, 0xAB, 0x6F, 0x30, 0xFF, 0xAC, 0x72, 0x31, 0xFF, 0xAF, 0x74, 0x32, 0xFF, 0xB0, 0x76, + 0x33, 0xFF, 0xB2, 0x78, 0x33, 0xFF, 0xB4, 0x79, 0x34, 0xFF, 0xB5, 0x7B, 0x34, 0xFF, 0xB6, 0x7C, + 0x34, 0xFF, 0xB7, 0x7D, 0x34, 0xFF, 0xB8, 0x7E, 0x35, 0xFF, 0xB9, 0x7E, 0x35, 0xFF, 0xB8, 0x7E, + 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, + 0x35, 0xFF, 0xBA, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xBA, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, + 0x35, 0xFF, 0xBA, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB8, 0x7F, + 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x80, 0x35, 0xFF, 0xB9, 0x81, 0x38, 0xFF, 0xBC, 0x86, + 0x40, 0xFF, 0xBE, 0x8B, 0x49, 0xFF, 0xBB, 0x8C, 0x4B, 0xFF, 0xB6, 0x8D, 0x50, 0xFF, 0xBA, 0x9A, + 0x6B, 0xFF, 0xCA, 0xBD, 0xAD, 0xFF, 0xD6, 0xD6, 0xD3, 0xFF, 0xD7, 0xD8, 0xD8, 0xFF, 0xD6, 0xD7, + 0xD8, 0xFF, 0xD6, 0xD8, 0xD8, 0xFF, 0xD6, 0xD8, 0xD7, 0xFF, 0xD6, 0xD8, 0xD8, 0xFF, 0xD7, 0xD8, + 0xD8, 0xFF, 0xD7, 0xD8, 0xD8, 0xFF, 0xD7, 0xD9, 0xD8, 0xFF, 0xD8, 0xD9, 0xD9, 0xFF, 0xD7, 0xD9, + 0xD8, 0xFF, 0xD8, 0xDA, 0xD9, 0xFF, 0xDA, 0xDB, 0xDC, 0xFF, 0xDA, 0xDA, 0xD7, 0xFF, 0xC1, 0xB9, + 0xA5, 0xFF, 0x9F, 0x8A, 0x64, 0xFF, 0xA3, 0x91, 0x69, 0xFF, 0xC3, 0xB3, 0x98, 0xFF, 0xDE, 0xD6, + 0xC8, 0xFF, 0xE1, 0xE2, 0xE0, 0xFF, 0xD9, 0xD8, 0xD2, 0xFF, 0xB2, 0xA4, 0x84, 0xFF, 0x9C, 0x88, + 0x63, 0xFF, 0x98, 0x83, 0x5E, 0xFF, 0x95, 0x81, 0x59, 0xFF, 0xA8, 0x9A, 0x7E, 0xFF, 0xD4, 0xD1, + 0xCC, 0xFF, 0xDF, 0xE0, 0xE1, 0xFF, 0xDE, 0xE0, 0xE0, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xDF, 0xE0, + 0xE0, 0xFF, 0xE0, 0xDF, 0xE0, 0xFF, 0xE1, 0xE0, 0xE2, 0xFF, 0xDE, 0xDD, 0xDA, 0xFF, 0xC1, 0xBD, + 0xAE, 0xFF, 0x9F, 0x94, 0x77, 0xFF, 0x97, 0x86, 0x65, 0xFF, 0x9D, 0x8D, 0x6D, 0xFF, 0xC1, 0xBB, + 0xAC, 0xFF, 0xDE, 0xDD, 0xDB, 0xFF, 0xDB, 0xDC, 0xDD, 0xFF, 0xD9, 0xD9, 0xDA, 0xFF, 0xDC, 0xDA, + 0xD9, 0xFF, 0xD3, 0xCD, 0xC4, 0xFF, 0xAB, 0x9D, 0x80, 0xFF, 0x90, 0x77, 0x4B, 0xFF, 0x8F, 0x6C, + 0x37, 0xFF, 0x98, 0x6E, 0x31, 0xFF, 0xA4, 0x74, 0x33, 0xFF, 0xAE, 0x79, 0x35, 0xFF, 0xB4, 0x7D, + 0x35, 0xFF, 0xB7, 0x7E, 0x35, 0xFF, 0xB8, 0x7E, 0x34, 0xFF, 0xB9, 0x7E, 0x35, 0xFF, 0xB9, 0x7E, + 0x35, 0xFF, 0xBA, 0x7E, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, + 0x35, 0xFF, 0xBA, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB8, 0x7F, + 0x35, 0xFF, 0xB9, 0x7E, 0x35, 0xFF, 0xB8, 0x7E, 0x35, 0xFF, 0xB8, 0x7D, 0x34, 0xFF, 0xB7, 0x7D, + 0x34, 0xFF, 0xB6, 0x7C, 0x34, 0xFF, 0xB6, 0x7D, 0x36, 0xFF, 0xB8, 0x80, 0x3E, 0xFF, 0xBB, 0x86, + 0x45, 0xFF, 0xC9, 0xA2, 0x72, 0xFF, 0xD6, 0xB7, 0x93, 0xE9, 0xD9, 0xBA, 0x96, 0x1F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0xC2, 0xA4, 0x15, 0xDC, 0xBE, 0x9E, 0x8C, 0xC3, 0x9A, + 0x6C, 0xEB, 0xB5, 0x80, 0x48, 0xFF, 0xAE, 0x76, 0x3D, 0xFF, 0xAB, 0x70, 0x36, 0xFF, 0xAA, 0x70, + 0x33, 0xFF, 0xAD, 0x72, 0x32, 0xFF, 0xAE, 0x74, 0x34, 0xFF, 0xB0, 0x77, 0x35, 0xFF, 0xB3, 0x79, + 0x35, 0xFF, 0xB4, 0x7A, 0x35, 0xFF, 0xB6, 0x7C, 0x36, 0xFF, 0xB7, 0x7D, 0x36, 0xFF, 0xB7, 0x7E, + 0x36, 0xFF, 0xB8, 0x7F, 0x36, 0xFF, 0xB9, 0x80, 0x37, 0xFF, 0xBA, 0x80, 0x37, 0xFF, 0xBA, 0x81, + 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBA, 0x81, 0x37, 0xFF, 0xBA, 0x81, 0x37, 0xFF, 0xBB, 0x81, + 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBB, 0x81, + 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBA, 0x81, 0x37, 0xFF, 0xBA, 0x81, 0x37, 0xFF, 0xBB, 0x81, + 0x37, 0xFF, 0xBB, 0x82, 0x38, 0xFF, 0xBC, 0x84, 0x3C, 0xFF, 0xBF, 0x8A, 0x46, 0xFF, 0xC3, 0x91, + 0x4F, 0xFF, 0xC2, 0x91, 0x52, 0xFF, 0xC1, 0x91, 0x52, 0xFF, 0xBD, 0x90, 0x52, 0xFF, 0xB7, 0x90, + 0x56, 0xFF, 0xBE, 0xA1, 0x7A, 0xFF, 0xD0, 0xC7, 0xBB, 0xFF, 0xD9, 0xD7, 0xD3, 0xFF, 0xD8, 0xD8, + 0xD8, 0xFF, 0xD8, 0xD9, 0xD9, 0xFF, 0xD8, 0xDA, 0xDA, 0xFF, 0xD8, 0xDA, 0xDA, 0xFF, 0xD9, 0xDA, + 0xDA, 0xFF, 0xDA, 0xDB, 0xDB, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, 0xD8, 0xDA, + 0xD9, 0xFF, 0xD8, 0xD9, 0xDA, 0xFF, 0xDA, 0xDB, 0xDC, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xCE, 0xCE, + 0xC4, 0xFF, 0xAB, 0x9D, 0x80, 0xFF, 0x9E, 0x8C, 0x6B, 0xFF, 0xAF, 0x9F, 0x82, 0xFF, 0xDB, 0xD2, + 0xC5, 0xFF, 0xE5, 0xE1, 0xE1, 0xFF, 0xE5, 0xE4, 0xE2, 0xFF, 0xCA, 0xC6, 0xB5, 0xFF, 0xA2, 0x93, + 0x6F, 0xFF, 0x99, 0x87, 0x5B, 0xFF, 0x8E, 0x7C, 0x55, 0xFF, 0xAA, 0x9D, 0x84, 0xFF, 0xD6, 0xD4, + 0xCE, 0xFF, 0xDB, 0xDC, 0xDC, 0xFF, 0xDC, 0xDE, 0xDE, 0xFF, 0xDF, 0xDF, 0xE0, 0xFF, 0xDF, 0xE0, + 0xE0, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xDF, 0xE0, + 0xDE, 0xFF, 0xC9, 0xC6, 0xBC, 0xFF, 0xA8, 0x9C, 0x81, 0xFF, 0x9A, 0x8A, 0x69, 0xFF, 0x99, 0x8B, + 0x6C, 0xFF, 0xBE, 0xB6, 0xA4, 0xFF, 0xDE, 0xDD, 0xD9, 0xFF, 0xDD, 0xDC, 0xDC, 0xFF, 0xDA, 0xDA, + 0xD9, 0xFF, 0xDC, 0xDB, 0xD9, 0xFF, 0xDA, 0xD6, 0xCD, 0xFF, 0xBB, 0xAF, 0x98, 0xFF, 0x9A, 0x80, + 0x55, 0xFF, 0x95, 0x72, 0x3C, 0xFF, 0x9F, 0x75, 0x36, 0xFF, 0xA8, 0x78, 0x35, 0xFF, 0xB1, 0x7C, + 0x36, 0xFF, 0xB7, 0x7F, 0x36, 0xFF, 0xB9, 0x81, 0x37, 0xFF, 0xBA, 0x81, 0x37, 0xFF, 0xBA, 0x81, + 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBB, 0x81, + 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBA, 0x81, 0x37, 0xFF, 0xBA, 0x81, 0x37, 0xFF, 0xBA, 0x81, + 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBA, 0x80, 0x37, 0xFF, 0xB9, 0x7F, 0x36, 0xFF, 0xB8, 0x7F, + 0x36, 0xFF, 0xB8, 0x7F, 0x36, 0xFF, 0xB7, 0x7E, 0x38, 0xFF, 0xB9, 0x83, 0x41, 0xFF, 0xBF, 0x8C, + 0x4B, 0xFF, 0xCC, 0xA7, 0x7B, 0xFF, 0xDA, 0xBB, 0x98, 0xE1, 0xDB, 0xBD, 0x9A, 0x1F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDD, 0xC2, 0xA4, 0x11, 0xDF, 0xC1, 0xA1, 0x84, 0xC9, 0xA2, + 0x75, 0xE6, 0xB8, 0x85, 0x4F, 0xFF, 0xB2, 0x7B, 0x41, 0xFF, 0xAD, 0x73, 0x38, 0xFF, 0xAC, 0x72, + 0x34, 0xFF, 0xAF, 0x74, 0x34, 0xFF, 0xB0, 0x76, 0x35, 0xFF, 0xB3, 0x79, 0x36, 0xFF, 0xB4, 0x7B, + 0x37, 0xFF, 0xB6, 0x7D, 0x37, 0xFF, 0xB8, 0x7E, 0x38, 0xFF, 0xB9, 0x7F, 0x38, 0xFF, 0xB9, 0x80, + 0x38, 0xFF, 0xBA, 0x81, 0x38, 0xFF, 0xBB, 0x82, 0x39, 0xFF, 0xBC, 0x82, 0x39, 0xFF, 0xBC, 0x83, + 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBB, 0x83, 0x39, 0xFF, 0xBB, 0x83, 0x39, 0xFF, 0xBC, 0x83, + 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, + 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBB, 0x83, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBD, 0x84, + 0x3A, 0xFF, 0xBE, 0x87, 0x3E, 0xFF, 0xC2, 0x8D, 0x48, 0xFF, 0xC5, 0x93, 0x53, 0xFF, 0xC6, 0x95, + 0x56, 0xFF, 0xC5, 0x94, 0x56, 0xFF, 0xC5, 0x94, 0x56, 0xFF, 0xC3, 0x93, 0x56, 0xFF, 0xBC, 0x91, + 0x55, 0xFF, 0xBC, 0x94, 0x5E, 0xFF, 0xC2, 0xAA, 0x87, 0xFF, 0xD6, 0xCE, 0xC5, 0xFF, 0xDB, 0xDA, + 0xD8, 0xFF, 0xDB, 0xDA, 0xDB, 0xFF, 0xDA, 0xDB, 0xDC, 0xFF, 0xDA, 0xDC, 0xDC, 0xFF, 0xDB, 0xDD, + 0xDC, 0xFF, 0xDC, 0xDC, 0xDC, 0xFF, 0xDC, 0xDC, 0xDD, 0xFF, 0xDB, 0xDC, 0xDC, 0xFF, 0xDB, 0xDC, + 0xDC, 0xFF, 0xDA, 0xDB, 0xDC, 0xFF, 0xDA, 0xDB, 0xDC, 0xFF, 0xDD, 0xDD, 0xDE, 0xFF, 0xD1, 0xD1, + 0xCC, 0xFF, 0xB4, 0xAA, 0x8E, 0xFF, 0xBD, 0xB1, 0x97, 0xFF, 0xA7, 0x98, 0x79, 0xFF, 0xC0, 0xB3, + 0x9D, 0xFF, 0xDB, 0xD6, 0xD0, 0xFF, 0xE4, 0xE4, 0xE6, 0xFF, 0xDC, 0xDB, 0xDB, 0xFF, 0xB7, 0xAF, + 0x9E, 0xFF, 0x9D, 0x8F, 0x71, 0xFF, 0xA4, 0x9A, 0x83, 0xFF, 0xCC, 0xCB, 0xBF, 0xFF, 0xDA, 0xDB, + 0xDB, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDA, 0xDB, 0xDD, 0xFF, 0xDC, 0xDD, 0xDE, 0xFF, 0xDE, 0xDF, + 0xDF, 0xFF, 0xDF, 0xE0, 0xE1, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xE1, 0xE2, + 0xE3, 0xFF, 0xDF, 0xE1, 0xE0, 0xFF, 0xD2, 0xD1, 0xCA, 0xFF, 0xAF, 0xA7, 0x8F, 0xFF, 0x9D, 0x8E, + 0x6E, 0xFF, 0x9B, 0x8C, 0x6C, 0xFF, 0xBA, 0xB3, 0xA2, 0xFF, 0xDD, 0xDC, 0xD6, 0xFF, 0xDB, 0xDB, + 0xDB, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDE, 0xDB, 0xDD, 0xFF, 0xDB, 0xD7, 0xD1, 0xFF, 0xC3, 0xB8, + 0xA1, 0xFF, 0x9C, 0x84, 0x5B, 0xFF, 0x9B, 0x76, 0x3E, 0xFF, 0xA4, 0x77, 0x37, 0xFF, 0xAF, 0x7C, + 0x36, 0xFF, 0xB7, 0x7F, 0x38, 0xFF, 0xBA, 0x82, 0x38, 0xFF, 0xBC, 0x82, 0x39, 0xFF, 0xBC, 0x82, + 0x38, 0xFF, 0xBC, 0x82, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, + 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBB, 0x83, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, + 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBB, 0x82, 0x39, 0xFF, 0xBB, 0x81, 0x38, 0xFF, 0xBA, 0x81, + 0x38, 0xFF, 0xB9, 0x80, 0x38, 0xFF, 0xB8, 0x80, 0x3B, 0xFF, 0xBC, 0x86, 0x44, 0xFF, 0xC1, 0x90, + 0x51, 0xFF, 0xD0, 0xAD, 0x82, 0xFF, 0xDB, 0xBD, 0x9A, 0xD1, 0xDD, 0xBF, 0x9D, 0x1E, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDD, 0xC4, 0xA5, 0x10, 0xDE, 0xC2, 0xA2, 0x77, 0xCA, 0xA6, + 0x7B, 0xE4, 0xBA, 0x89, 0x52, 0xFF, 0xB4, 0x7E, 0x45, 0xFF, 0xB0, 0x76, 0x3B, 0xFF, 0xAF, 0x74, + 0x37, 0xFF, 0xB1, 0x76, 0x36, 0xFF, 0xB3, 0x78, 0x37, 0xFF, 0xB4, 0x7B, 0x38, 0xFF, 0xB6, 0x7D, + 0x39, 0xFF, 0xB8, 0x7F, 0x3A, 0xFF, 0xB9, 0x80, 0x3A, 0xFF, 0xBA, 0x81, 0x3A, 0xFF, 0xBB, 0x82, + 0x3A, 0xFF, 0xBC, 0x83, 0x3A, 0xFF, 0xBC, 0x84, 0x3B, 0xFF, 0xBD, 0x84, 0x3B, 0xFF, 0xBE, 0x85, + 0x3B, 0xFF, 0xBE, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBD, 0x85, + 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBD, 0x85, + 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBE, 0x85, 0x3B, 0xFF, 0xBE, 0x85, 0x3C, 0xFF, 0xBF, 0x88, + 0x40, 0xFF, 0xC4, 0x8F, 0x4C, 0xFF, 0xC6, 0x95, 0x56, 0xFF, 0xC7, 0x97, 0x5A, 0xFF, 0xC7, 0x98, + 0x5A, 0xFF, 0xC7, 0x99, 0x5A, 0xFF, 0xC7, 0x98, 0x5A, 0xFF, 0xC6, 0x97, 0x5A, 0xFF, 0xC4, 0x96, + 0x59, 0xFF, 0xC0, 0x95, 0x5A, 0xFF, 0xBB, 0x98, 0x65, 0xFF, 0xC6, 0xB0, 0x95, 0xFF, 0xD9, 0xD3, + 0xCA, 0xFF, 0xE0, 0xDD, 0xDB, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDB, 0xDE, + 0xDE, 0xFF, 0xDD, 0xDE, 0xDE, 0xFF, 0xDD, 0xDE, 0xDF, 0xFF, 0xDE, 0xDE, 0xDF, 0xFF, 0xDD, 0xDE, + 0xDE, 0xFF, 0xDD, 0xDE, 0xDF, 0xFF, 0xDD, 0xDE, 0xDE, 0xFF, 0xE1, 0xE0, 0xE0, 0xFF, 0xCD, 0xCB, + 0xC5, 0xFF, 0xB1, 0xAA, 0x91, 0xFF, 0xDE, 0xDB, 0xCE, 0xFF, 0xC5, 0xBC, 0xA5, 0xFF, 0xA7, 0x9B, + 0x7E, 0xFF, 0xBE, 0xB4, 0x9F, 0xFF, 0xDD, 0xDA, 0xD3, 0xFF, 0xE4, 0xE4, 0xE5, 0xFF, 0xDB, 0xDC, + 0xDB, 0xFF, 0xD4, 0xD0, 0xC9, 0xFF, 0xD6, 0xD5, 0xCE, 0xFF, 0xDD, 0xDF, 0xDD, 0xFF, 0xDB, 0xDC, + 0xDB, 0xFF, 0xD9, 0xDA, 0xDA, 0xFF, 0xD8, 0xDA, 0xDA, 0xFF, 0xDA, 0xDA, 0xDB, 0xFF, 0xDC, 0xDD, + 0xDD, 0xFF, 0xDE, 0xDF, 0xDF, 0xFF, 0xDF, 0xE1, 0xE1, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xE0, 0xE2, + 0xE2, 0xFF, 0xE2, 0xE3, 0xE2, 0xFF, 0xE1, 0xE3, 0xE2, 0xFF, 0xD9, 0xD9, 0xD5, 0xFF, 0xBC, 0xB6, + 0xA2, 0xFF, 0xA1, 0x94, 0x74, 0xFF, 0x9B, 0x90, 0x71, 0xFF, 0xB9, 0xB3, 0x9E, 0xFF, 0xDC, 0xD9, + 0xD3, 0xFF, 0xDF, 0xDD, 0xDD, 0xFF, 0xDC, 0xDB, 0xDC, 0xFF, 0xDF, 0xDD, 0xDE, 0xFF, 0xE1, 0xDD, + 0xD5, 0xFF, 0xC7, 0xBA, 0xA5, 0xFF, 0xA1, 0x84, 0x55, 0xFF, 0xA1, 0x77, 0x36, 0xFF, 0xAE, 0x7D, + 0x38, 0xFF, 0xB7, 0x81, 0x3B, 0xFF, 0xBB, 0x83, 0x3B, 0xFF, 0xBD, 0x84, 0x3B, 0xFF, 0xBD, 0x84, + 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBD, 0x85, + 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBC, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBE, 0x85, + 0x3B, 0xFF, 0xBE, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBC, 0x84, 0x3A, 0xFF, 0xBC, 0x83, + 0x3A, 0xFF, 0xBB, 0x83, 0x3A, 0xFF, 0xBA, 0x83, 0x3D, 0xFF, 0xBE, 0x89, 0x46, 0xFF, 0xC4, 0x93, + 0x55, 0xFF, 0xD2, 0xAF, 0x84, 0xFD, 0xDB, 0xBE, 0x9B, 0xC1, 0xDE, 0xC1, 0x9F, 0x1E, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDD, 0xC4, 0xA5, 0x09, 0xDF, 0xC3, 0xA3, 0x68, 0xCE, 0xAA, + 0x80, 0xDE, 0xBD, 0x8C, 0x54, 0xFE, 0xB8, 0x82, 0x49, 0xFF, 0xB2, 0x79, 0x3D, 0xFF, 0xB0, 0x76, + 0x38, 0xFF, 0xB3, 0x78, 0x38, 0xFF, 0xB4, 0x7A, 0x39, 0xFF, 0xB6, 0x7D, 0x3A, 0xFF, 0xB7, 0x7F, + 0x3B, 0xFF, 0xB9, 0x81, 0x3B, 0xFF, 0xBA, 0x82, 0x3C, 0xFF, 0xBC, 0x83, 0x3C, 0xFF, 0xBD, 0x84, + 0x3C, 0xFF, 0xBE, 0x85, 0x3C, 0xFF, 0xBE, 0x86, 0x3D, 0xFF, 0xBF, 0x86, 0x3D, 0xFF, 0xBF, 0x87, + 0x3D, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBE, 0x87, 0x3D, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBE, 0x87, + 0x3D, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBE, 0x87, 0x3D, 0xFF, 0xBE, 0x87, 0x3D, 0xFF, 0xBE, 0x87, + 0x3D, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xC0, 0x8A, 0x42, 0xFF, 0xC5, 0x91, + 0x4D, 0xFF, 0xC7, 0x98, 0x59, 0xFF, 0xC9, 0x9A, 0x5D, 0xFF, 0xCA, 0x9B, 0x5D, 0xFF, 0xC9, 0x9B, + 0x5D, 0xFF, 0xC9, 0x9B, 0x5D, 0xFF, 0xC9, 0x9B, 0x5D, 0xFF, 0xC9, 0x9A, 0x5D, 0xFF, 0xC8, 0x9A, + 0x5D, 0xFF, 0xC6, 0x99, 0x5E, 0xFF, 0xC0, 0x98, 0x5F, 0xFF, 0xBF, 0x9D, 0x6E, 0xFF, 0xCA, 0xB9, + 0x9E, 0xFF, 0xDD, 0xD8, 0xD2, 0xFF, 0xDF, 0xDE, 0xDE, 0xFF, 0xDE, 0xDF, 0xE0, 0xFF, 0xDD, 0xDF, + 0xE0, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xE0, 0xE0, 0xE1, 0xFF, 0xDF, 0xE0, + 0xE1, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xC8, 0xC5, + 0xBD, 0xFF, 0xBC, 0xB5, 0x9F, 0xFF, 0xE6, 0xE4, 0xE1, 0xFF, 0xE0, 0xDD, 0xD4, 0xFF, 0xBC, 0xB4, + 0x9F, 0xFF, 0xAC, 0xA0, 0x81, 0xFF, 0xB9, 0xAD, 0x94, 0xFF, 0xDB, 0xD6, 0xCE, 0xFF, 0xE2, 0xE1, + 0xE1, 0xFF, 0xE2, 0xE1, 0xE0, 0xFF, 0xDD, 0xDE, 0xDD, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDB, 0xDC, + 0xDC, 0xFF, 0xDA, 0xDB, 0xDB, 0xFF, 0xDA, 0xDA, 0xDB, 0xFF, 0xD9, 0xDA, 0xDA, 0xFF, 0xDA, 0xDB, + 0xDB, 0xFF, 0xDC, 0xDD, 0xDE, 0xFF, 0xDE, 0xE0, 0xE0, 0xFF, 0xE0, 0xE1, 0xE2, 0xFF, 0xE0, 0xE2, + 0xE2, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE2, 0xE3, 0xE2, 0xFF, 0xE1, 0xE3, 0xE3, 0xFF, 0xDF, 0xDF, + 0xDE, 0xFF, 0xC9, 0xC4, 0xB6, 0xFF, 0xA4, 0x98, 0x7C, 0xFF, 0x99, 0x8E, 0x6E, 0xFF, 0xB9, 0xB3, + 0xA0, 0xFF, 0xDC, 0xDA, 0xD4, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDE, 0xDE, 0xE0, 0xFF, 0xE2, 0xE0, + 0xDF, 0xFF, 0xDE, 0xD7, 0xCE, 0xFF, 0xB0, 0x99, 0x75, 0xFF, 0xA5, 0x7A, 0x3C, 0xFF, 0xB1, 0x7F, + 0x3D, 0xFF, 0xB8, 0x82, 0x3D, 0xFF, 0xBC, 0x84, 0x3C, 0xFF, 0xBF, 0x86, 0x3C, 0xFF, 0xBF, 0x86, + 0x3D, 0xFF, 0xBF, 0x86, 0x3D, 0xFF, 0xBE, 0x87, 0x3D, 0xFF, 0xBE, 0x87, 0x3D, 0xFF, 0xBE, 0x87, + 0x3D, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBE, 0x87, 0x3D, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBF, 0x87, + 0x3D, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBE, 0x87, 0x3D, 0xFF, 0xBE, 0x86, 0x3C, 0xFF, 0xBD, 0x85, + 0x3B, 0xFF, 0xBD, 0x84, 0x3C, 0xFF, 0xBC, 0x85, 0x3F, 0xFF, 0xC1, 0x8D, 0x4B, 0xFF, 0xC7, 0x98, + 0x5B, 0xFF, 0xD3, 0xB2, 0x88, 0xF9, 0xDC, 0xC0, 0x9D, 0xB2, 0xDF, 0xC4, 0xA3, 0x18, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xC5, 0xA6, 0x06, 0xDF, 0xC3, 0xA3, 0x55, 0xD1, 0xAD, + 0x83, 0xD8, 0xC0, 0x90, 0x58, 0xFF, 0xBB, 0x86, 0x4D, 0xFF, 0xB5, 0x7C, 0x41, 0xFF, 0xB3, 0x79, + 0x3B, 0xFF, 0xB5, 0x7A, 0x3A, 0xFF, 0xB6, 0x7C, 0x3B, 0xFF, 0xB7, 0x7F, 0x3C, 0xFF, 0xBA, 0x81, + 0x3D, 0xFF, 0xBB, 0x83, 0x3D, 0xFF, 0xBC, 0x84, 0x3D, 0xFF, 0xBD, 0x85, 0x3E, 0xFF, 0xBE, 0x86, + 0x3E, 0xFF, 0xBF, 0x87, 0x3F, 0xFF, 0xBF, 0x88, 0x3F, 0xFF, 0xC0, 0x89, 0x3F, 0xFF, 0xC0, 0x89, + 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC0, 0x89, + 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC0, 0x89, 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC1, 0x89, + 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC1, 0x8B, 0x42, 0xFF, 0xC5, 0x92, 0x4E, 0xFF, 0xCA, 0x9B, + 0x5C, 0xFF, 0xCA, 0x9D, 0x62, 0xFF, 0xCB, 0x9E, 0x61, 0xFF, 0xCC, 0x9E, 0x61, 0xFF, 0xCB, 0x9E, + 0x61, 0xFF, 0xCC, 0x9E, 0x61, 0xFF, 0xCB, 0x9E, 0x61, 0xFF, 0xCB, 0x9E, 0x61, 0xFF, 0xCA, 0x9D, + 0x60, 0xFF, 0xCA, 0x9D, 0x61, 0xFF, 0xC8, 0x9C, 0x60, 0xFF, 0xC3, 0x9B, 0x63, 0xFF, 0xC0, 0xA2, + 0x74, 0xFF, 0xD0, 0xC0, 0xAB, 0xFF, 0xDF, 0xDC, 0xD6, 0xFF, 0xE4, 0xE2, 0xE3, 0xFF, 0xE1, 0xE1, + 0xE2, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE1, 0xE2, 0xE3, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE1, 0xE2, + 0xE3, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE3, 0xE2, 0xE0, 0xFF, 0xC9, 0xC5, + 0xB9, 0xFF, 0xBE, 0xB8, 0xA1, 0xFF, 0xE4, 0xE4, 0xE0, 0xFF, 0xE8, 0xE5, 0xE4, 0xFF, 0xE0, 0xDE, + 0xD8, 0xFF, 0xBB, 0xB4, 0xA3, 0xFF, 0xA8, 0x9D, 0x7F, 0xFF, 0xB6, 0xAA, 0x92, 0xFF, 0xDA, 0xD6, + 0xCE, 0xFF, 0xE1, 0xE0, 0xE1, 0xFF, 0xDE, 0xDE, 0xDD, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xDD, 0xDD, + 0xDE, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDB, 0xDC, 0xDD, 0xFF, 0xDB, 0xDC, 0xDC, 0xFF, 0xDA, 0xDB, + 0xDA, 0xFF, 0xDB, 0xDB, 0xDC, 0xFF, 0xDD, 0xDE, 0xDE, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xE0, 0xE2, + 0xE1, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE3, 0xE4, 0xE3, 0xFF, 0xE3, 0xE4, 0xE3, 0xFF, 0xE2, 0xE4, + 0xE3, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xD2, 0xCE, 0xC4, 0xFF, 0xAD, 0xA3, 0x8A, 0xFF, 0x9A, 0x92, + 0x75, 0xFF, 0xB9, 0xB4, 0xA0, 0xFF, 0xDC, 0xD9, 0xD5, 0xFF, 0xE1, 0xE0, 0xDF, 0xFF, 0xE1, 0xE0, + 0xDE, 0xFF, 0xE1, 0xDC, 0xD7, 0xFF, 0xB8, 0xA5, 0x82, 0xFF, 0xA9, 0x7C, 0x3F, 0xFF, 0xB4, 0x82, + 0x40, 0xFF, 0xB9, 0x84, 0x3F, 0xFF, 0xBE, 0x87, 0x3E, 0xFF, 0xC1, 0x88, 0x3F, 0xFF, 0xC1, 0x89, + 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC0, 0x89, 0x3F, 0xFF, 0xC0, 0x89, 0x3F, 0xFF, 0xC0, 0x89, + 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC0, 0x89, 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC1, 0x89, + 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC0, 0x89, 0x3F, 0xFF, 0xBF, 0x88, 0x3E, 0xFF, 0xBF, 0x87, + 0x3D, 0xFF, 0xBF, 0x87, 0x3E, 0xFF, 0xBE, 0x88, 0x42, 0xFF, 0xC3, 0x91, 0x50, 0xFF, 0xC9, 0x9C, + 0x60, 0xFF, 0xD5, 0xB5, 0x8B, 0xF3, 0xDE, 0xC5, 0xA2, 0xA0, 0xE2, 0xC9, 0xA9, 0x18, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xC6, 0xA7, 0x05, 0xDE, 0xC2, 0xA2, 0x40, 0xD3, 0xAF, + 0x84, 0xCC, 0xC4, 0x95, 0x60, 0xFC, 0xBE, 0x8A, 0x52, 0xFF, 0xB8, 0x80, 0x44, 0xFF, 0xB5, 0x7C, + 0x3D, 0xFF, 0xB6, 0x7C, 0x3C, 0xFF, 0xB7, 0x7E, 0x3D, 0xFF, 0xBA, 0x81, 0x3E, 0xFF, 0xBB, 0x83, + 0x3F, 0xFF, 0xBD, 0x85, 0x3F, 0xFF, 0xBE, 0x86, 0x3F, 0xFF, 0xBF, 0x87, 0x3F, 0xFF, 0xC0, 0x88, + 0x40, 0xFF, 0xC1, 0x89, 0x40, 0xFF, 0xC1, 0x8A, 0x41, 0xFF, 0xC2, 0x8B, 0x41, 0xFF, 0xC2, 0x8B, + 0x41, 0xFF, 0xC3, 0x8B, 0x41, 0xFF, 0xC2, 0x8B, 0x41, 0xFF, 0xC3, 0x8B, 0x41, 0xFF, 0xC2, 0x8A, + 0x41, 0xFF, 0xC2, 0x8A, 0x40, 0xFF, 0xC2, 0x8B, 0x40, 0xFF, 0xC2, 0x8B, 0x41, 0xFF, 0xC3, 0x8B, + 0x41, 0xFF, 0xC3, 0x8C, 0x43, 0xFF, 0xC6, 0x92, 0x4C, 0xFF, 0xCA, 0x9B, 0x5B, 0xFF, 0xCC, 0xA0, + 0x64, 0xFF, 0xCD, 0xA1, 0x65, 0xFF, 0xCD, 0xA0, 0x65, 0xFF, 0xCE, 0xA0, 0x64, 0xFF, 0xCD, 0xA0, + 0x64, 0xFF, 0xCE, 0xA1, 0x64, 0xFF, 0xCD, 0xA0, 0x64, 0xFF, 0xCD, 0xA0, 0x64, 0xFF, 0xCD, 0xA0, + 0x64, 0xFF, 0xCC, 0xA0, 0x63, 0xFF, 0xCC, 0xA0, 0x63, 0xFF, 0xC9, 0x9E, 0x64, 0xFF, 0xC3, 0x9D, + 0x68, 0xFF, 0xC5, 0xA8, 0x7E, 0xFF, 0xD4, 0xC8, 0xB6, 0xFF, 0xE2, 0xE0, 0xDB, 0xFF, 0xE3, 0xE3, + 0xE3, 0xFF, 0xE2, 0xE3, 0xE4, 0xFF, 0xE2, 0xE4, 0xE4, 0xFF, 0xE3, 0xE4, 0xE4, 0xFF, 0xE3, 0xE4, + 0xE5, 0xFF, 0xE3, 0xE4, 0xE4, 0xFF, 0xE3, 0xE3, 0xE2, 0xFF, 0xE4, 0xE3, 0xE2, 0xFF, 0xCE, 0xCA, + 0xBE, 0xFF, 0xBE, 0xB6, 0x9C, 0xFF, 0xDD, 0xDB, 0xD5, 0xFF, 0xE4, 0xE2, 0xE2, 0xFF, 0xE7, 0xE5, + 0xE5, 0xFF, 0xDD, 0xDB, 0xD6, 0xFF, 0xBF, 0xB7, 0xA1, 0xFF, 0xB1, 0xA3, 0x85, 0xFF, 0xBE, 0xB4, + 0x9E, 0xFF, 0xDA, 0xD5, 0xCD, 0xFF, 0xDE, 0xDC, 0xDB, 0xFF, 0xDB, 0xDA, 0xD9, 0xFF, 0xDB, 0xDB, + 0xDA, 0xFF, 0xDE, 0xDE, 0xDD, 0xFF, 0xDD, 0xDE, 0xDD, 0xFF, 0xDD, 0xDE, 0xDE, 0xFF, 0xDD, 0xDE, + 0xDD, 0xFF, 0xDC, 0xDC, 0xDC, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDD, 0xDE, 0xDF, 0xFF, 0xDF, 0xE0, + 0xE0, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE3, 0xE3, 0xE4, 0xFF, 0xE3, 0xE4, 0xE4, 0xFF, 0xE3, 0xE4, + 0xE4, 0xFF, 0xE3, 0xE4, 0xE5, 0xFF, 0xE4, 0xE3, 0xE3, 0xFF, 0xDD, 0xD9, 0xD3, 0xFF, 0xB3, 0xAC, + 0x96, 0xFF, 0x9E, 0x94, 0x76, 0xFF, 0xBB, 0xB3, 0x9F, 0xFF, 0xDD, 0xDA, 0xD3, 0xFF, 0xE4, 0xE2, + 0xDE, 0xFF, 0xE4, 0xDF, 0xD9, 0xFF, 0xBC, 0xA7, 0x81, 0xFF, 0xAC, 0x7D, 0x40, 0xFF, 0xB7, 0x85, + 0x43, 0xFF, 0xBB, 0x86, 0x40, 0xFF, 0xBF, 0x89, 0x40, 0xFF, 0xC2, 0x8B, 0x41, 0xFF, 0xC2, 0x8B, + 0x41, 0xFF, 0xC2, 0x8B, 0x41, 0xFF, 0xC2, 0x8B, 0x41, 0xFF, 0xC2, 0x8B, 0x41, 0xFF, 0xC2, 0x8B, + 0x41, 0xFF, 0xC2, 0x8B, 0x41, 0xFF, 0xC2, 0x8B, 0x41, 0xFF, 0xC3, 0x8B, 0x41, 0xFF, 0xC2, 0x8B, + 0x41, 0xFF, 0xC2, 0x8B, 0x41, 0xFF, 0xC1, 0x8A, 0x40, 0xFF, 0xC1, 0x8A, 0x40, 0xFF, 0xC1, 0x89, + 0x3F, 0xFF, 0xC0, 0x89, 0x41, 0xFF, 0xBF, 0x8A, 0x44, 0xFF, 0xC7, 0x95, 0x57, 0xFF, 0xCB, 0x9F, + 0x66, 0xFF, 0xD7, 0xB8, 0x8F, 0xEB, 0xE2, 0xCA, 0xAA, 0x8B, 0xE5, 0xCD, 0xAF, 0x11, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE2, 0xC8, 0xAA, 0x04, 0xDF, 0xC2, 0x9E, 0x2E, 0xD4, 0xB1, + 0x88, 0xB6, 0xC6, 0x9A, 0x67, 0xFA, 0xC1, 0x8F, 0x57, 0xFF, 0xBA, 0x83, 0x48, 0xFF, 0xB7, 0x7F, + 0x40, 0xFF, 0xB8, 0x7F, 0x3E, 0xFF, 0xBA, 0x80, 0x3F, 0xFF, 0xBB, 0x83, 0x40, 0xFF, 0xBD, 0x85, + 0x41, 0xFF, 0xBE, 0x87, 0x41, 0xFF, 0xC0, 0x88, 0x42, 0xFF, 0xC1, 0x8A, 0x42, 0xFF, 0xC1, 0x8A, + 0x42, 0xFF, 0xC2, 0x8B, 0x42, 0xFF, 0xC2, 0x8C, 0x43, 0xFF, 0xC3, 0x8D, 0x43, 0xFF, 0xC3, 0x8D, + 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, + 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8E, + 0x43, 0xFF, 0xC7, 0x91, 0x4B, 0xFF, 0xCB, 0x9C, 0x5B, 0xFF, 0xCD, 0xA1, 0x65, 0xFF, 0xCE, 0xA2, + 0x68, 0xFF, 0xCF, 0xA3, 0x68, 0xFF, 0xCF, 0xA3, 0x68, 0xFF, 0xCF, 0xA3, 0x68, 0xFF, 0xCF, 0xA3, + 0x68, 0xFF, 0xCF, 0xA3, 0x68, 0xFF, 0xCF, 0xA3, 0x68, 0xFF, 0xCF, 0xA3, 0x68, 0xFF, 0xCF, 0xA3, + 0x67, 0xFF, 0xCF, 0xA3, 0x67, 0xFF, 0xCE, 0xA2, 0x67, 0xFF, 0xCC, 0xA1, 0x67, 0xFF, 0xC9, 0xA1, + 0x67, 0xFF, 0xC5, 0xA0, 0x6C, 0xFF, 0xC7, 0xAD, 0x85, 0xFF, 0xD9, 0xCF, 0xC1, 0xFF, 0xE4, 0xE3, + 0xDF, 0xFF, 0xE6, 0xE6, 0xE7, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE4, 0xE6, + 0xE7, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE5, 0xE6, 0xE5, 0xFF, 0xE7, 0xE5, 0xE4, 0xFF, 0xD1, 0xCC, + 0xC4, 0xFF, 0xBA, 0xAC, 0x8F, 0xFF, 0xC6, 0xBC, 0xA6, 0xFF, 0xD4, 0xCE, 0xBF, 0xFF, 0xDB, 0xD8, + 0xD6, 0xFF, 0xE3, 0xE3, 0xE2, 0xFF, 0xDF, 0xDF, 0xD6, 0xFF, 0xC3, 0xB8, 0xA2, 0xFF, 0xB6, 0xAB, + 0x8E, 0xFF, 0xBE, 0xB3, 0x9B, 0xFF, 0xCB, 0xC1, 0xB2, 0xFF, 0xCC, 0xC6, 0xBA, 0xFF, 0xD0, 0xCE, + 0xC5, 0xFF, 0xDA, 0xDB, 0xD7, 0xFF, 0xDD, 0xDF, 0xDF, 0xFF, 0xDE, 0xE0, 0xE0, 0xFF, 0xDF, 0xE0, + 0xE0, 0xFF, 0xDF, 0xDF, 0xE0, 0xFF, 0xDD, 0xDE, 0xDE, 0xFF, 0xDD, 0xDE, 0xDE, 0xFF, 0xDD, 0xDE, + 0xDE, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE5, + 0xE5, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE3, 0xE5, 0xE5, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE0, 0xDF, + 0xD9, 0xFF, 0xC1, 0xBB, 0xA9, 0xFF, 0xA6, 0x9C, 0x7F, 0xFF, 0xBD, 0xB4, 0x9D, 0xFF, 0xE1, 0xDC, + 0xD2, 0xFF, 0xE5, 0xDC, 0xD0, 0xFF, 0xB9, 0x9F, 0x74, 0xFF, 0xB1, 0x83, 0x43, 0xFF, 0xBB, 0x89, + 0x44, 0xFF, 0xBE, 0x8A, 0x43, 0xFF, 0xC2, 0x8C, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC3, 0x8D, + 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, + 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, + 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC3, 0x8C, 0x43, 0xFF, 0xC3, 0x8B, 0x42, 0xFF, 0xC2, 0x8A, + 0x41, 0xFF, 0xC1, 0x8B, 0x43, 0xFF, 0xC1, 0x8D, 0x48, 0xFF, 0xCA, 0x99, 0x5C, 0xFF, 0xCE, 0xA4, + 0x6B, 0xFF, 0xDA, 0xBA, 0x93, 0xE1, 0xE5, 0xCF, 0xB2, 0x72, 0xE8, 0xD2, 0xB5, 0x0D, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0xD2, 0xB6, 0x04, 0xE6, 0xCC, 0xAF, 0x23, 0xD9, 0xB9, + 0x92, 0x9D, 0xCA, 0xA1, 0x6F, 0xF4, 0xC4, 0x94, 0x5D, 0xFF, 0xBC, 0x87, 0x4C, 0xFF, 0xB9, 0x81, + 0x43, 0xFF, 0xBA, 0x81, 0x41, 0xFF, 0xBB, 0x82, 0x40, 0xFF, 0xBD, 0x85, 0x42, 0xFF, 0xBE, 0x87, + 0x42, 0xFF, 0xC0, 0x89, 0x43, 0xFF, 0xC2, 0x8A, 0x44, 0xFF, 0xC3, 0x8B, 0x44, 0xFF, 0xC3, 0x8C, + 0x44, 0xFF, 0xC3, 0x8D, 0x44, 0xFF, 0xC4, 0x8E, 0x45, 0xFF, 0xC5, 0x8F, 0x45, 0xFF, 0xC5, 0x8F, + 0x45, 0xFF, 0xC5, 0x8F, 0x45, 0xFF, 0xC5, 0x8F, 0x45, 0xFF, 0xC5, 0x8E, 0x45, 0xFF, 0xC5, 0x8E, + 0x45, 0xFF, 0xC5, 0x8F, 0x45, 0xFF, 0xC5, 0x8F, 0x45, 0xFF, 0xC6, 0x8F, 0x45, 0xFF, 0xC6, 0x90, + 0x48, 0xFF, 0xCA, 0x98, 0x56, 0xFF, 0xCF, 0xA2, 0x66, 0xFF, 0xD0, 0xA5, 0x6A, 0xFF, 0xCF, 0xA5, + 0x6A, 0xFF, 0xD0, 0xA5, 0x6A, 0xFF, 0xD0, 0xA5, 0x6B, 0xFF, 0xD0, 0xA5, 0x6B, 0xFF, 0xD0, 0xA5, + 0x6B, 0xFF, 0xD0, 0xA5, 0x6B, 0xFF, 0xD0, 0xA5, 0x6A, 0xFF, 0xD0, 0xA5, 0x6B, 0xFF, 0xD0, 0xA5, + 0x6B, 0xFF, 0xD0, 0xA5, 0x6A, 0xFF, 0xD0, 0xA5, 0x6A, 0xFF, 0xCF, 0xA4, 0x6A, 0xFF, 0xCE, 0xA5, + 0x6A, 0xFF, 0xCB, 0xA3, 0x6B, 0xFF, 0xC6, 0xA3, 0x71, 0xFF, 0xCD, 0xB5, 0x91, 0xFF, 0xDD, 0xD7, + 0xCB, 0xFF, 0xE6, 0xE6, 0xE3, 0xFF, 0xE7, 0xE8, 0xE7, 0xFF, 0xE6, 0xE8, 0xE8, 0xFF, 0xE6, 0xE8, + 0xE8, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE7, 0xE8, 0xE8, 0xFF, 0xE9, 0xE8, 0xE6, 0xFF, 0xCC, 0xC7, + 0xBE, 0xFF, 0xAF, 0x9F, 0x7F, 0xFF, 0xAD, 0x9A, 0x75, 0xFF, 0xB2, 0xA0, 0x7B, 0xFF, 0xBF, 0xB3, + 0x9B, 0xFF, 0xDF, 0xD9, 0xD0, 0xFF, 0xE7, 0xE7, 0xE5, 0xFF, 0xD6, 0xD0, 0xC3, 0xFF, 0xBA, 0xAC, + 0x91, 0xFF, 0xB0, 0xA0, 0x7D, 0xFF, 0xB0, 0x9F, 0x77, 0xFF, 0xB5, 0xA5, 0x81, 0xFF, 0xC1, 0xB5, + 0x9D, 0xFF, 0xD8, 0xD3, 0xCA, 0xFF, 0xDE, 0xDE, 0xDF, 0xFF, 0xDE, 0xE0, 0xE0, 0xFF, 0xDF, 0xE1, + 0xE2, 0xFF, 0xE0, 0xE1, 0xE2, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xDF, 0xDF, 0xE0, 0xFF, 0xDE, 0xDF, + 0xDF, 0xFF, 0xDE, 0xDF, 0xE0, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE3, 0xE3, 0xE4, 0xFF, 0xE4, 0xE5, + 0xE6, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE5, 0xE7, 0xE7, 0xFF, 0xE5, 0xE7, 0xE7, 0xFF, 0xE8, 0xE9, + 0xE8, 0xFF, 0xE5, 0xE3, 0xDE, 0xFF, 0xCE, 0xC8, 0xB7, 0xFF, 0xB9, 0xAD, 0x91, 0xFF, 0xC4, 0xBC, + 0xA3, 0xFF, 0xD9, 0xCA, 0xAD, 0xFF, 0xB6, 0x94, 0x5E, 0xFF, 0xB6, 0x86, 0x43, 0xFF, 0xBC, 0x8B, + 0x44, 0xFF, 0xC0, 0x8C, 0x44, 0xFF, 0xC3, 0x8E, 0x45, 0xFF, 0xC5, 0x8F, 0x45, 0xFF, 0xC5, 0x8F, + 0x45, 0xFF, 0xC5, 0x8F, 0x45, 0xFF, 0xC5, 0x8F, 0x45, 0xFF, 0xC5, 0x8F, 0x45, 0xFF, 0xC5, 0x8F, + 0x45, 0xFF, 0xC5, 0x8F, 0x45, 0xFF, 0xC5, 0x8F, 0x45, 0xFF, 0xC5, 0x8F, 0x45, 0xFF, 0xC5, 0x8F, + 0x45, 0xFF, 0xC5, 0x8E, 0x45, 0xFF, 0xC4, 0x8E, 0x44, 0xFF, 0xC4, 0x8D, 0x44, 0xFF, 0xC3, 0x8D, + 0x43, 0xFF, 0xC3, 0x8D, 0x45, 0xFF, 0xC4, 0x91, 0x4B, 0xFF, 0xCB, 0x9C, 0x63, 0xFF, 0xD0, 0xA8, + 0x72, 0xFF, 0xDD, 0xBE, 0x98, 0xD5, 0xE8, 0xD2, 0xB7, 0x58, 0xEA, 0xD3, 0xB8, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xE4, 0xD8, 0x02, 0xF9, 0xEE, 0xE1, 0x15, 0xE1, 0xC1, + 0x9D, 0x86, 0xCE, 0xA5, 0x74, 0xED, 0xC6, 0x98, 0x64, 0xFE, 0xBF, 0x8B, 0x51, 0xFF, 0xBB, 0x84, + 0x46, 0xFF, 0xBC, 0x84, 0x44, 0xFF, 0xBD, 0x85, 0x44, 0xFF, 0xBF, 0x87, 0x44, 0xFF, 0xC1, 0x8A, + 0x45, 0xFF, 0xC2, 0x8B, 0x46, 0xFF, 0xC3, 0x8C, 0x46, 0xFF, 0xC4, 0x8D, 0x46, 0xFF, 0xC4, 0x8E, + 0x47, 0xFF, 0xC5, 0x8F, 0x47, 0xFF, 0xC6, 0x90, 0x48, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC6, 0x91, + 0x48, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC7, 0x91, + 0x48, 0xFF, 0xC7, 0x91, 0x47, 0xFF, 0xC6, 0x91, 0x47, 0xFF, 0xC8, 0x92, 0x48, 0xFF, 0xC8, 0x96, + 0x51, 0xFF, 0xCF, 0xA2, 0x65, 0xFF, 0xD1, 0xA8, 0x6D, 0xFF, 0xD2, 0xA9, 0x6F, 0xFF, 0xD1, 0xA8, + 0x6E, 0xFF, 0xD2, 0xA8, 0x6E, 0xFF, 0xD1, 0xA8, 0x6E, 0xFF, 0xD2, 0xA8, 0x6E, 0xFF, 0xD2, 0xA8, + 0x6E, 0xFF, 0xD2, 0xA8, 0x6E, 0xFF, 0xD2, 0xA8, 0x6E, 0xFF, 0xD2, 0xA8, 0x6E, 0xFF, 0xD1, 0xA8, + 0x6E, 0xFF, 0xD2, 0xA8, 0x6E, 0xFF, 0xD2, 0xA8, 0x6E, 0xFF, 0xD2, 0xA8, 0x6E, 0xFF, 0xD1, 0xA8, + 0x6E, 0xFF, 0xCF, 0xA7, 0x6E, 0xFF, 0xCB, 0xA5, 0x6E, 0xFF, 0xC8, 0xA7, 0x74, 0xFF, 0xCE, 0xBA, + 0x9A, 0xFF, 0xE0, 0xDB, 0xD3, 0xFF, 0xE8, 0xE8, 0xE5, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE7, 0xEA, + 0xEA, 0xFF, 0xE7, 0xE9, 0xEA, 0xFF, 0xE8, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, 0xE7, 0xFF, 0xCA, 0xC6, + 0xB6, 0xFF, 0x9F, 0x91, 0x6C, 0xFF, 0xA6, 0x95, 0x6A, 0xFF, 0xA9, 0x98, 0x6F, 0xFF, 0xAA, 0x9C, + 0x7D, 0xFF, 0xD2, 0xCC, 0xBF, 0xFF, 0xE5, 0xE4, 0xE1, 0xFF, 0xDA, 0xD8, 0xD0, 0xFF, 0xB7, 0xAA, + 0x91, 0xFF, 0xA8, 0x96, 0x6F, 0xFF, 0xA7, 0x95, 0x6B, 0xFF, 0xAB, 0x98, 0x70, 0xFF, 0xB6, 0xA8, + 0x8B, 0xFF, 0xD6, 0xCF, 0xC6, 0xFF, 0xE1, 0xDF, 0xE0, 0xFF, 0xDF, 0xE0, 0xE2, 0xFF, 0xDF, 0xE1, + 0xE2, 0xFF, 0xE1, 0xE1, 0xE2, 0xFF, 0xE1, 0xE2, 0xE3, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE0, 0xE1, + 0xE1, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE4, 0xE5, + 0xE5, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE7, 0xE8, 0xE9, 0xFF, 0xE6, 0xE7, + 0xE8, 0xFF, 0xE8, 0xE8, 0xE9, 0xFF, 0xE7, 0xE5, 0xE1, 0xFF, 0xDC, 0xD6, 0xCD, 0xFF, 0xC7, 0xBD, + 0xA0, 0xFF, 0xC1, 0xA7, 0x7C, 0xFF, 0xB5, 0x8D, 0x52, 0xFF, 0xB6, 0x87, 0x43, 0xFF, 0xBE, 0x8D, + 0x45, 0xFF, 0xC3, 0x8F, 0x47, 0xFF, 0xC5, 0x90, 0x47, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC7, 0x91, + 0x48, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC6, 0x91, + 0x48, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC6, 0x91, 0x48, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC7, 0x91, + 0x48, 0xFF, 0xC6, 0x91, 0x48, 0xFF, 0xC6, 0x91, 0x48, 0xFF, 0xC6, 0x90, 0x47, 0xFF, 0xC5, 0x8F, + 0x46, 0xFF, 0xC5, 0x90, 0x48, 0xFF, 0xC7, 0x95, 0x51, 0xFF, 0xCE, 0xA1, 0x69, 0xFF, 0xD5, 0xAE, + 0x79, 0xFE, 0xE2, 0xC4, 0x9D, 0xBD, 0xEC, 0xD3, 0xB9, 0x3C, 0xE9, 0xD3, 0xB9, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0xE9, 0xD8, 0x0E, 0xD9, 0xB8, + 0x8E, 0x65, 0xD0, 0xA8, 0x77, 0xE0, 0xCA, 0x9E, 0x6A, 0xFE, 0xC3, 0x8F, 0x57, 0xFF, 0xBE, 0x87, + 0x49, 0xFF, 0xBF, 0x86, 0x46, 0xFF, 0xBF, 0x87, 0x46, 0xFF, 0xC1, 0x8A, 0x46, 0xFF, 0xC2, 0x8C, + 0x47, 0xFF, 0xC4, 0x8E, 0x48, 0xFF, 0xC5, 0x8E, 0x48, 0xFF, 0xC5, 0x8F, 0x48, 0xFF, 0xC6, 0x90, + 0x49, 0xFF, 0xC7, 0x92, 0x49, 0xFF, 0xC8, 0x92, 0x4A, 0xFF, 0xC9, 0x93, 0x4A, 0xFF, 0xC8, 0x93, + 0x4A, 0xFF, 0xC9, 0x93, 0x4A, 0xFF, 0xC8, 0x93, 0x4A, 0xFF, 0xC8, 0x93, 0x4A, 0xFF, 0xC8, 0x93, + 0x49, 0xFF, 0xC9, 0x93, 0x49, 0xFF, 0xC8, 0x93, 0x49, 0xFF, 0xC9, 0x95, 0x4E, 0xFF, 0xCD, 0x9F, + 0x5D, 0xFF, 0xD2, 0xA8, 0x6D, 0xFF, 0xD3, 0xAB, 0x72, 0xFF, 0xD4, 0xAB, 0x72, 0xFF, 0xD3, 0xAB, + 0x71, 0xFF, 0xD4, 0xAA, 0x71, 0xFF, 0xD3, 0xAA, 0x71, 0xFF, 0xD3, 0xAA, 0x71, 0xFF, 0xD3, 0xAA, + 0x71, 0xFF, 0xD3, 0xAA, 0x71, 0xFF, 0xD3, 0xAA, 0x71, 0xFF, 0xD3, 0xAA, 0x71, 0xFF, 0xD3, 0xAA, + 0x71, 0xFF, 0xD3, 0xAA, 0x71, 0xFF, 0xD3, 0xAB, 0x71, 0xFF, 0xD4, 0xAB, 0x71, 0xFF, 0xD4, 0xAB, + 0x71, 0xFF, 0xD2, 0xAA, 0x71, 0xFF, 0xCF, 0xA9, 0x70, 0xFF, 0xCD, 0xA7, 0x71, 0xFF, 0xCB, 0xAB, + 0x7B, 0xFF, 0xD3, 0xC1, 0xA7, 0xFF, 0xE3, 0xE0, 0xDA, 0xFF, 0xE9, 0xEA, 0xE8, 0xFF, 0xEA, 0xEB, + 0xEA, 0xFF, 0xE9, 0xEB, 0xEB, 0xFF, 0xE9, 0xEB, 0xEA, 0xFF, 0xE7, 0xE8, 0xE7, 0xFF, 0xD1, 0xD0, + 0xC4, 0xFF, 0xA4, 0x9A, 0x7A, 0xFF, 0xA3, 0x95, 0x6F, 0xFF, 0xA4, 0x94, 0x73, 0xFF, 0xB4, 0xAA, + 0x96, 0xFF, 0xDC, 0xDA, 0xD2, 0xFF, 0xE5, 0xE5, 0xE4, 0xFF, 0xDC, 0xDC, 0xD8, 0xFF, 0xBD, 0xB9, + 0xA7, 0xFF, 0xA3, 0x94, 0x71, 0xFF, 0xA3, 0x8F, 0x6A, 0xFF, 0xA6, 0x95, 0x6E, 0xFF, 0xA9, 0x9D, + 0x7C, 0xFF, 0xD4, 0xD0, 0xC7, 0xFF, 0xE2, 0xE1, 0xE1, 0xFF, 0xE0, 0xE1, 0xE2, 0xFF, 0xE0, 0xE2, + 0xE2, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE2, 0xE4, 0xE3, 0xFF, 0xE3, 0xE4, 0xE4, 0xFF, 0xE3, 0xE4, + 0xE4, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE4, 0xE4, + 0xE5, 0xFF, 0xE5, 0xE5, 0xE6, 0xFF, 0xE6, 0xE7, 0xE8, 0xFF, 0xE7, 0xE8, 0xE9, 0xFF, 0xE6, 0xE8, + 0xEA, 0xFF, 0xE7, 0xE8, 0xEA, 0xFF, 0xEB, 0xEA, 0xEA, 0xFF, 0xE1, 0xDF, 0xD9, 0xFF, 0xC5, 0xB9, + 0x9C, 0xFF, 0xB6, 0x99, 0x66, 0xFF, 0xB3, 0x8E, 0x53, 0xFF, 0xB5, 0x89, 0x44, 0xFF, 0xBE, 0x8E, + 0x47, 0xFF, 0xC3, 0x90, 0x49, 0xFF, 0xC5, 0x92, 0x49, 0xFF, 0xC7, 0x93, 0x4A, 0xFF, 0xC8, 0x93, + 0x4A, 0xFF, 0xC9, 0x93, 0x4A, 0xFF, 0xC8, 0x93, 0x4A, 0xFF, 0xC8, 0x93, 0x4A, 0xFF, 0xC8, 0x93, + 0x4A, 0xFF, 0xC9, 0x93, 0x4A, 0xFF, 0xC8, 0x93, 0x4A, 0xFF, 0xC9, 0x93, 0x4A, 0xFF, 0xC8, 0x93, + 0x4A, 0xFF, 0xC8, 0x93, 0x4A, 0xFF, 0xC7, 0x93, 0x49, 0xFF, 0xC8, 0x92, 0x49, 0xFF, 0xC7, 0x92, + 0x49, 0xFF, 0xC7, 0x93, 0x4C, 0xFF, 0xC9, 0x99, 0x57, 0xFF, 0xD2, 0xA7, 0x70, 0xFF, 0xD9, 0xB3, + 0x80, 0xF8, 0xDF, 0xC4, 0x9F, 0xA2, 0xE4, 0xCE, 0xB5, 0x2C, 0xE1, 0xD0, 0xB8, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xC0, 0x9A, 0x05, 0xD9, 0xB8, + 0x8B, 0x47, 0xD6, 0xB0, 0x82, 0xD0, 0xCE, 0xA4, 0x70, 0xFD, 0xC7, 0x95, 0x5D, 0xFF, 0xC2, 0x8C, + 0x4F, 0xFF, 0xC2, 0x8A, 0x4A, 0xFF, 0xC1, 0x8A, 0x48, 0xFF, 0xC3, 0x8C, 0x48, 0xFF, 0xC4, 0x8E, + 0x49, 0xFF, 0xC5, 0x90, 0x4A, 0xFF, 0xC6, 0x91, 0x4B, 0xFF, 0xC7, 0x92, 0x4B, 0xFF, 0xC8, 0x93, + 0x4B, 0xFF, 0xC9, 0x94, 0x4C, 0xFF, 0xCA, 0x95, 0x4C, 0xFF, 0xCB, 0x95, 0x4C, 0xFF, 0xCA, 0x95, + 0x4C, 0xFF, 0xCB, 0x96, 0x4C, 0xFF, 0xCA, 0x95, 0x4C, 0xFF, 0xCB, 0x95, 0x4C, 0xFF, 0xCA, 0x96, + 0x4C, 0xFF, 0xCB, 0x96, 0x4C, 0xFF, 0xCA, 0x96, 0x4D, 0xFF, 0xCD, 0x9C, 0x57, 0xFF, 0xD3, 0xA8, + 0x6B, 0xFF, 0xD5, 0xAD, 0x74, 0xFF, 0xD5, 0xAD, 0x75, 0xFF, 0xD5, 0xAE, 0x75, 0xFF, 0xD5, 0xAE, + 0x75, 0xFF, 0xD5, 0xAE, 0x75, 0xFF, 0xD5, 0xAD, 0x75, 0xFF, 0xD6, 0xAE, 0x75, 0xFF, 0xD5, 0xAE, + 0x75, 0xFF, 0xD6, 0xAE, 0x75, 0xFF, 0xD5, 0xAE, 0x75, 0xFF, 0xD6, 0xAE, 0x75, 0xFF, 0xD5, 0xAE, + 0x75, 0xFF, 0xD6, 0xAE, 0x75, 0xFF, 0xD5, 0xAD, 0x75, 0xFF, 0xD5, 0xAE, 0x75, 0xFF, 0xD5, 0xAD, + 0x75, 0xFF, 0xD5, 0xAD, 0x75, 0xFF, 0xD3, 0xAD, 0x74, 0xFF, 0xD1, 0xAA, 0x74, 0xFF, 0xCD, 0xAA, + 0x76, 0xFF, 0xCE, 0xAF, 0x82, 0xFF, 0xD7, 0xC7, 0xB1, 0xFF, 0xE6, 0xE4, 0xDF, 0xFF, 0xEC, 0xEC, + 0xEA, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEA, 0xEC, 0xEC, 0xFF, 0xEA, 0xEA, 0xEC, 0xFF, 0xE6, 0xE7, + 0xE5, 0xFF, 0xC9, 0xC5, 0xB6, 0xFF, 0xBC, 0xB3, 0x9D, 0xFF, 0xC4, 0xBC, 0xAC, 0xFF, 0xDD, 0xDB, + 0xD0, 0xFF, 0xE3, 0xE4, 0xE2, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE1, 0xE0, 0xE0, 0xFF, 0xD5, 0xD5, + 0xCC, 0xFF, 0xB9, 0xB3, 0x9D, 0xFF, 0xB1, 0xA5, 0x87, 0xFF, 0xAF, 0xA2, 0x81, 0xFF, 0xA5, 0x9B, + 0x7B, 0xFF, 0xD3, 0xCF, 0xC6, 0xFF, 0xE2, 0xE2, 0xE3, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE2, 0xE3, + 0xE3, 0xFF, 0xE3, 0xE3, 0xE4, 0xFF, 0xE3, 0xE4, 0xE4, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE4, 0xE5, + 0xE5, 0xFF, 0xE5, 0xE5, 0xE6, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE4, 0xE4, + 0xE4, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE5, 0xE7, 0xE7, 0xFF, 0xE7, 0xE8, 0xE9, 0xFF, 0xE7, 0xE8, + 0xEA, 0xFF, 0xE9, 0xEA, 0xEB, 0xFF, 0xE9, 0xE9, 0xE6, 0xFF, 0xD4, 0xD1, 0xC2, 0xFF, 0xBB, 0xAE, + 0x8A, 0xFF, 0xBC, 0xA6, 0x7A, 0xFF, 0xB3, 0x94, 0x5E, 0xFF, 0xB2, 0x89, 0x49, 0xFF, 0xBA, 0x8D, + 0x47, 0xFF, 0xC1, 0x91, 0x49, 0xFF, 0xC4, 0x92, 0x4A, 0xFF, 0xC7, 0x93, 0x4C, 0xFF, 0xC9, 0x95, + 0x4C, 0xFF, 0xCA, 0x95, 0x4C, 0xFF, 0xCA, 0x95, 0x4C, 0xFF, 0xCA, 0x96, 0x4C, 0xFF, 0xCA, 0x96, + 0x4C, 0xFF, 0xCB, 0x96, 0x4C, 0xFF, 0xCA, 0x96, 0x4C, 0xFF, 0xCB, 0x96, 0x4C, 0xFF, 0xCA, 0x96, + 0x4C, 0xFF, 0xCA, 0x95, 0x4C, 0xFF, 0xC9, 0x95, 0x4C, 0xFF, 0xCA, 0x95, 0x4B, 0xFF, 0xC9, 0x94, + 0x4C, 0xFF, 0xCA, 0x96, 0x50, 0xFF, 0xCC, 0x9E, 0x5D, 0xFF, 0xD5, 0xAD, 0x77, 0xFF, 0xDC, 0xB8, + 0x86, 0xEE, 0xD7, 0xBC, 0x9A, 0x86, 0xC6, 0xBC, 0xAF, 0x1C, 0xD3, 0xC8, 0xB9, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0xB6, 0x8C, 0x02, 0xDE, 0xBF, + 0x97, 0x2C, 0xDC, 0xB9, 0x90, 0xB4, 0xD3, 0xAA, 0x77, 0xF6, 0xCC, 0x9C, 0x63, 0xFF, 0xC6, 0x91, + 0x55, 0xFF, 0xC4, 0x8C, 0x4D, 0xFF, 0xC3, 0x8C, 0x4A, 0xFF, 0xC5, 0x8D, 0x4A, 0xFF, 0xC5, 0x8F, + 0x4B, 0xFF, 0xC7, 0x92, 0x4C, 0xFF, 0xC8, 0x93, 0x4D, 0xFF, 0xC9, 0x94, 0x4D, 0xFF, 0xCA, 0x95, + 0x4D, 0xFF, 0xCB, 0x96, 0x4D, 0xFF, 0xCC, 0x97, 0x4E, 0xFF, 0xCC, 0x97, 0x4E, 0xFF, 0xCC, 0x98, + 0x4E, 0xFF, 0xCD, 0x98, 0x4E, 0xFF, 0xCC, 0x97, 0x4D, 0xFF, 0xCC, 0x97, 0x4D, 0xFF, 0xCC, 0x98, + 0x4D, 0xFF, 0xCD, 0x98, 0x4E, 0xFF, 0xCC, 0x99, 0x51, 0xFF, 0xD2, 0xA3, 0x62, 0xFF, 0xD6, 0xAE, + 0x75, 0xFF, 0xD8, 0xB0, 0x78, 0xFF, 0xD7, 0xB0, 0x78, 0xFF, 0xD7, 0xB0, 0x78, 0xFF, 0xD7, 0xB0, + 0x78, 0xFF, 0xD8, 0xB0, 0x78, 0xFF, 0xD7, 0xB0, 0x78, 0xFF, 0xD7, 0xB0, 0x78, 0xFF, 0xD7, 0xB0, + 0x77, 0xFF, 0xD7, 0xB0, 0x78, 0xFF, 0xD7, 0xB0, 0x78, 0xFF, 0xD8, 0xB0, 0x78, 0xFF, 0xD7, 0xB0, + 0x78, 0xFF, 0xD8, 0xB0, 0x78, 0xFF, 0xD7, 0xB0, 0x78, 0xFF, 0xD7, 0xB0, 0x78, 0xFF, 0xD7, 0xB0, + 0x78, 0xFF, 0xD7, 0xB0, 0x78, 0xFF, 0xD7, 0xAF, 0x78, 0xFF, 0xD5, 0xAE, 0x77, 0xFF, 0xD1, 0xAD, + 0x77, 0xFF, 0xD1, 0xAD, 0x7B, 0xFF, 0xD3, 0xB5, 0x89, 0xFF, 0xDB, 0xCE, 0xBC, 0xFF, 0xE9, 0xE8, + 0xE4, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, 0xED, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xEA, 0xE8, 0xE7, 0xFF, 0xE5, 0xE4, 0xE2, 0xFF, 0xE4, 0xE3, 0xE3, 0xFF, 0xE7, 0xE8, + 0xE7, 0xFF, 0xE6, 0xE7, 0xE8, 0xFF, 0xE7, 0xE7, 0xE8, 0xFF, 0xE7, 0xE6, 0xE7, 0xFF, 0xE5, 0xE5, + 0xE4, 0xFF, 0xDD, 0xDC, 0xD8, 0xFF, 0xD4, 0xD3, 0xCD, 0xFF, 0xCF, 0xCC, 0xC2, 0xFF, 0xBD, 0xBA, + 0xA9, 0xFF, 0xD7, 0xD7, 0xD1, 0xFF, 0xE3, 0xE4, 0xE5, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE4, 0xE5, + 0xE5, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE6, 0xE6, + 0xE7, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE6, 0xE6, 0xE7, 0xFF, 0xE5, 0xE6, + 0xE6, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE6, 0xE7, 0xE8, 0xFF, 0xE7, 0xE8, 0xE9, 0xFF, 0xE9, 0xEA, + 0xEB, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, 0xE7, 0xFF, 0xCD, 0xC7, 0xB7, 0xFF, 0xB3, 0xA7, + 0x88, 0xFF, 0xC5, 0xB3, 0x8F, 0xFF, 0xC2, 0xAA, 0x7C, 0xFF, 0xB4, 0x91, 0x5A, 0xFF, 0xB5, 0x8D, + 0x4D, 0xFF, 0xBB, 0x8F, 0x4A, 0xFF, 0xC1, 0x92, 0x4B, 0xFF, 0xC5, 0x93, 0x4C, 0xFF, 0xC8, 0x96, + 0x4D, 0xFF, 0xCA, 0x97, 0x4D, 0xFF, 0xCB, 0x97, 0x4E, 0xFF, 0xCC, 0x98, 0x4E, 0xFF, 0xCC, 0x98, + 0x4E, 0xFF, 0xCC, 0x98, 0x4E, 0xFF, 0xCC, 0x98, 0x4E, 0xFF, 0xCD, 0x98, 0x4E, 0xFF, 0xCC, 0x98, + 0x4E, 0xFF, 0xCC, 0x97, 0x4E, 0xFF, 0xCB, 0x97, 0x4D, 0xFF, 0xCC, 0x97, 0x4E, 0xFF, 0xCB, 0x96, + 0x4F, 0xFF, 0xCC, 0x9A, 0x55, 0xFF, 0xCF, 0xA3, 0x64, 0xFF, 0xDA, 0xB2, 0x7F, 0xFD, 0xE0, 0xBE, + 0x8F, 0xDE, 0xDE, 0xC2, 0x9C, 0x64, 0xC3, 0xB6, 0xA5, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE5, 0xC9, + 0xA5, 0x1A, 0xE1, 0xC1, 0x9B, 0x8E, 0xD5, 0xAF, 0x7D, 0xEA, 0xCE, 0xA2, 0x6A, 0xFF, 0xCA, 0x97, + 0x5C, 0xFF, 0xC6, 0x90, 0x51, 0xFF, 0xC5, 0x8E, 0x4D, 0xFF, 0xC7, 0x90, 0x4D, 0xFF, 0xC8, 0x92, + 0x4D, 0xFF, 0xC9, 0x94, 0x4F, 0xFF, 0xCA, 0x95, 0x4F, 0xFF, 0xCB, 0x96, 0x4F, 0xFF, 0xCC, 0x97, + 0x4F, 0xFF, 0xCD, 0x98, 0x50, 0xFF, 0xCD, 0x99, 0x50, 0xFF, 0xCE, 0x9A, 0x50, 0xFF, 0xCE, 0x9A, + 0x50, 0xFF, 0xCF, 0x9A, 0x50, 0xFF, 0xCE, 0x9A, 0x50, 0xFF, 0xCE, 0x9A, 0x4F, 0xFF, 0xCE, 0x9A, + 0x4F, 0xFF, 0xCF, 0x9B, 0x51, 0xFF, 0xCF, 0x9F, 0x57, 0xFF, 0xD6, 0xAB, 0x6F, 0xFF, 0xD9, 0xB2, + 0x7A, 0xFF, 0xDA, 0xB3, 0x7C, 0xFF, 0xDA, 0xB3, 0x7B, 0xFF, 0xDA, 0xB3, 0x7B, 0xFF, 0xD9, 0xB3, + 0x7B, 0xFF, 0xDA, 0xB3, 0x7B, 0xFF, 0xD9, 0xB3, 0x7B, 0xFF, 0xDA, 0xB3, 0x7B, 0xFF, 0xD9, 0xB3, + 0x7B, 0xFF, 0xDA, 0xB3, 0x7B, 0xFF, 0xD9, 0xB3, 0x7B, 0xFF, 0xDA, 0xB3, 0x7B, 0xFF, 0xD9, 0xB3, + 0x7B, 0xFF, 0xDA, 0xB3, 0x7B, 0xFF, 0xD9, 0xB3, 0x7B, 0xFF, 0xDA, 0xB3, 0x7B, 0xFF, 0xD9, 0xB3, + 0x7B, 0xFF, 0xD9, 0xB3, 0x7B, 0xFF, 0xDA, 0xB2, 0x7B, 0xFF, 0xD9, 0xB2, 0x7B, 0xFF, 0xD6, 0xB1, + 0x7A, 0xFF, 0xD3, 0xAF, 0x7B, 0xFF, 0xD0, 0xAF, 0x7E, 0xFF, 0xD1, 0xB7, 0x8E, 0xFF, 0xDA, 0xD2, + 0xC1, 0xFF, 0xEC, 0xEA, 0xE7, 0xFF, 0xEE, 0xEE, 0xED, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEC, 0xED, + 0xEE, 0xFF, 0xED, 0xEF, 0xEE, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, 0xED, 0xFF, 0xEA, 0xEB, + 0xEB, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xEA, 0xEB, 0xEC, 0xFF, 0xE9, 0xEA, 0xEA, 0xFF, 0xE9, 0xEA, + 0xEA, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE3, 0xE2, 0xE1, 0xFF, 0xDD, 0xDE, + 0xDA, 0xFF, 0xE1, 0xE4, 0xE2, 0xFF, 0xE5, 0xE6, 0xE7, 0xFF, 0xE6, 0xE7, 0xE8, 0xFF, 0xE6, 0xE8, + 0xE8, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE6, 0xE7, + 0xE7, 0xFF, 0xE7, 0xE8, 0xE8, 0xFF, 0xE7, 0xE8, 0xE8, 0xFF, 0xE8, 0xE8, 0xE9, 0xFF, 0xE6, 0xE8, + 0xE7, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE8, 0xE8, 0xE9, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEC, + 0xEC, 0xFF, 0xEE, 0xEE, 0xED, 0xFF, 0xF0, 0xF0, 0xEC, 0xFF, 0xD6, 0xD3, 0xC5, 0xFF, 0xB5, 0xAC, + 0x91, 0xFF, 0xC5, 0xB9, 0x9B, 0xFF, 0xCE, 0xC0, 0x9F, 0xFF, 0xBF, 0xA9, 0x81, 0xFF, 0xB3, 0x92, + 0x5B, 0xFF, 0xB3, 0x8D, 0x4E, 0xFF, 0xB8, 0x8F, 0x4B, 0xFF, 0xBF, 0x92, 0x4D, 0xFF, 0xC5, 0x95, + 0x4E, 0xFF, 0xC9, 0x98, 0x4F, 0xFF, 0xCB, 0x99, 0x50, 0xFF, 0xCD, 0x99, 0x50, 0xFF, 0xCD, 0x99, + 0x50, 0xFF, 0xCE, 0x9A, 0x50, 0xFF, 0xCE, 0x9A, 0x50, 0xFF, 0xCF, 0x9A, 0x50, 0xFF, 0xCF, 0x9A, + 0x50, 0xFF, 0xCE, 0x9A, 0x50, 0xFF, 0xCE, 0x99, 0x4F, 0xFF, 0xCE, 0x99, 0x50, 0xFF, 0xCC, 0x99, + 0x52, 0xFF, 0xCF, 0x9F, 0x5A, 0xFF, 0xD4, 0xA9, 0x6C, 0xFF, 0xDD, 0xB8, 0x88, 0xFC, 0xE0, 0xC1, + 0x98, 0xCA, 0xDE, 0xC3, 0x9F, 0x43, 0xDE, 0xC2, 0x9F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0xCC, + 0xA9, 0x0E, 0xE2, 0xC3, 0x9D, 0x64, 0xD8, 0xB4, 0x83, 0xD9, 0xD2, 0xA8, 0x71, 0xFF, 0xCE, 0x9D, + 0x62, 0xFE, 0xC8, 0x94, 0x55, 0xFF, 0xC7, 0x91, 0x4F, 0xFF, 0xC9, 0x92, 0x4E, 0xFF, 0xC9, 0x93, + 0x4F, 0xFF, 0xCB, 0x96, 0x50, 0xFF, 0xCB, 0x97, 0x50, 0xFF, 0xCD, 0x98, 0x51, 0xFF, 0xCE, 0x99, + 0x51, 0xFF, 0xCF, 0x9A, 0x51, 0xFF, 0xCF, 0x9B, 0x52, 0xFF, 0xD0, 0x9C, 0x52, 0xFF, 0xD0, 0x9C, + 0x52, 0xFF, 0xD0, 0x9C, 0x52, 0xFF, 0xCF, 0x9C, 0x51, 0xFF, 0xD0, 0x9C, 0x51, 0xFF, 0xD0, 0x9C, + 0x52, 0xFF, 0xD1, 0x9D, 0x54, 0xFF, 0xD2, 0xA4, 0x5E, 0xFF, 0xD9, 0xB1, 0x77, 0xFF, 0xDB, 0xB5, + 0x7E, 0xFF, 0xDB, 0xB6, 0x7F, 0xFF, 0xDB, 0xB5, 0x7E, 0xFF, 0xDC, 0xB5, 0x7E, 0xFF, 0xDB, 0xB5, + 0x7E, 0xFF, 0xDB, 0xB5, 0x7E, 0xFF, 0xDB, 0xB5, 0x7D, 0xFF, 0xDB, 0xB5, 0x7E, 0xFF, 0xDB, 0xB5, + 0x7D, 0xFF, 0xDB, 0xB5, 0x7D, 0xFF, 0xDB, 0xB5, 0x7D, 0xFF, 0xDB, 0xB5, 0x7D, 0xFF, 0xDB, 0xB5, + 0x7D, 0xFF, 0xDB, 0xB5, 0x7E, 0xFF, 0xDB, 0xB5, 0x7D, 0xFF, 0xDB, 0xB5, 0x7E, 0xFF, 0xDB, 0xB5, + 0x7E, 0xFF, 0xDB, 0xB5, 0x7E, 0xFF, 0xDB, 0xB5, 0x7E, 0xFF, 0xDB, 0xB5, 0x7D, 0xFF, 0xDA, 0xB4, + 0x7E, 0xFF, 0xD8, 0xB3, 0x7D, 0xFF, 0xD4, 0xB2, 0x7D, 0xFF, 0xD4, 0xB3, 0x82, 0xFF, 0xD6, 0xBC, + 0x93, 0xFF, 0xE1, 0xD6, 0xC8, 0xFF, 0xED, 0xED, 0xE9, 0xFF, 0xEE, 0xED, 0xED, 0xFF, 0xED, 0xEE, + 0xEF, 0xFF, 0xED, 0xEE, 0xEF, 0xFF, 0xEE, 0xEF, 0xEE, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xED, 0xEF, + 0xEF, 0xFF, 0xED, 0xED, 0xEE, 0xFF, 0xEB, 0xED, 0xED, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, + 0xEC, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xEA, 0xEB, 0xE9, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE7, 0xE8, + 0xE8, 0xFF, 0xE7, 0xE8, 0xE9, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE8, 0xE9, + 0xE9, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE7, 0xE8, 0xE8, 0xFF, 0xE7, 0xE8, 0xE8, 0xFF, 0xE8, 0xE8, + 0xE9, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, + 0xE9, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xED, 0xED, + 0xEC, 0xFF, 0xEE, 0xEF, 0xED, 0xFF, 0xF0, 0xF0, 0xEF, 0xFF, 0xED, 0xEC, 0xE9, 0xFF, 0xD3, 0xCF, + 0xBF, 0xFF, 0xBF, 0xB7, 0x9F, 0xFF, 0xC9, 0xBF, 0xA5, 0xFF, 0xD1, 0xC5, 0xA9, 0xFF, 0xC1, 0xB0, + 0x8A, 0xFF, 0xB2, 0x96, 0x62, 0xFF, 0xB0, 0x8C, 0x51, 0xFF, 0xB8, 0x90, 0x4F, 0xFF, 0xC1, 0x95, + 0x4F, 0xFF, 0xC8, 0x98, 0x50, 0xFF, 0xCB, 0x9A, 0x51, 0xFF, 0xCE, 0x9B, 0x52, 0xFF, 0xCF, 0x9C, + 0x52, 0xFF, 0xD0, 0x9C, 0x52, 0xFF, 0xD0, 0x9C, 0x52, 0xFF, 0xD1, 0x9C, 0x52, 0xFF, 0xD0, 0x9B, + 0x51, 0xFF, 0xD0, 0x9B, 0x51, 0xFF, 0xD0, 0x9B, 0x51, 0xFF, 0xCF, 0x9B, 0x53, 0xFF, 0xCF, 0x9C, + 0x56, 0xFF, 0xD2, 0xA3, 0x61, 0xFF, 0xD8, 0xAF, 0x75, 0xFF, 0xDD, 0xBB, 0x8E, 0xF9, 0xDE, 0xC1, + 0x9B, 0xA4, 0xDC, 0xC2, 0xA1, 0x29, 0xDB, 0xC3, 0xA0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0xC7, + 0xA1, 0x05, 0xE0, 0xBF, 0x97, 0x3F, 0xD9, 0xB8, 0x8A, 0xBE, 0xD6, 0xAD, 0x78, 0xFD, 0xD1, 0xA2, + 0x68, 0xFE, 0xCC, 0x98, 0x5B, 0xFF, 0xC9, 0x94, 0x53, 0xFF, 0xCA, 0x94, 0x51, 0xFF, 0xCB, 0x96, + 0x51, 0xFF, 0xCC, 0x97, 0x51, 0xFF, 0xCD, 0x99, 0x52, 0xFF, 0xCE, 0x9A, 0x53, 0xFF, 0xCF, 0x9B, + 0x53, 0xFF, 0xD0, 0x9D, 0x54, 0xFF, 0xD0, 0x9D, 0x54, 0xFF, 0xD1, 0x9E, 0x54, 0xFF, 0xD1, 0x9E, + 0x54, 0xFF, 0xD2, 0x9F, 0x54, 0xFF, 0xD1, 0x9F, 0x54, 0xFF, 0xD2, 0x9E, 0x54, 0xFF, 0xD1, 0x9E, + 0x53, 0xFF, 0xD3, 0xA1, 0x57, 0xFF, 0xD6, 0xAC, 0x69, 0xFF, 0xDC, 0xB6, 0x7E, 0xFF, 0xDC, 0xB8, + 0x82, 0xFF, 0xDD, 0xB8, 0x82, 0xFF, 0xDC, 0xB8, 0x81, 0xFF, 0xDD, 0xB8, 0x81, 0xFF, 0xDC, 0xB8, + 0x81, 0xFF, 0xDD, 0xB8, 0x81, 0xFF, 0xDD, 0xB8, 0x81, 0xFF, 0xDD, 0xB8, 0x81, 0xFF, 0xDD, 0xB8, + 0x81, 0xFF, 0xDD, 0xB8, 0x81, 0xFF, 0xDC, 0xB8, 0x81, 0xFF, 0xDD, 0xB8, 0x81, 0xFF, 0xDD, 0xB8, + 0x81, 0xFF, 0xDD, 0xB8, 0x81, 0xFF, 0xDD, 0xB8, 0x81, 0xFF, 0xDD, 0xB8, 0x81, 0xFF, 0xDC, 0xB8, + 0x81, 0xFF, 0xDD, 0xB8, 0x81, 0xFF, 0xDC, 0xB8, 0x81, 0xFF, 0xDD, 0xB8, 0x81, 0xFF, 0xDC, 0xB7, + 0x81, 0xFF, 0xDC, 0xB7, 0x81, 0xFF, 0xD9, 0xB6, 0x80, 0xFF, 0xD6, 0xB4, 0x80, 0xFF, 0xD3, 0xB4, + 0x85, 0xFF, 0xD6, 0xBE, 0x9B, 0xFF, 0xE2, 0xDB, 0xCF, 0xFF, 0xED, 0xED, 0xEB, 0xFF, 0xEF, 0xEF, + 0xF0, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xEF, 0xF0, 0xF1, 0xFF, 0xEF, 0xF0, 0xF1, 0xFF, 0xEF, 0xF0, + 0xF1, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEC, 0xED, + 0xED, 0xFF, 0xEC, 0xEC, 0xED, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xE9, 0xEA, + 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xEA, 0xEA, 0xEB, 0xFF, 0xE9, 0xEA, + 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xE9, 0xEA, 0xEA, 0xFF, 0xE8, 0xE9, + 0xEA, 0xFF, 0xE9, 0xEA, 0xEA, 0xFF, 0xE9, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, 0xEB, 0xFF, 0xEB, 0xEB, + 0xEB, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEA, 0xEA, 0xE9, 0xFF, 0xEA, 0xEA, 0xE8, 0xFF, 0xEA, 0xEA, + 0xE8, 0xFF, 0xEB, 0xEC, 0xEA, 0xFF, 0xEC, 0xEE, 0xEC, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xF1, 0xF1, + 0xEE, 0xFF, 0xE3, 0xE0, 0xD5, 0xFF, 0xC5, 0xC0, 0xAB, 0xFF, 0xCD, 0xC6, 0xAF, 0xFF, 0xD8, 0xCF, + 0xB8, 0xFF, 0xCC, 0xBE, 0xA0, 0xFF, 0xB8, 0x9D, 0x6D, 0xFF, 0xB5, 0x91, 0x58, 0xFF, 0xBD, 0x94, + 0x53, 0xFF, 0xC4, 0x98, 0x51, 0xFF, 0xCB, 0x9B, 0x53, 0xFF, 0xCE, 0x9D, 0x54, 0xFF, 0xD0, 0x9E, + 0x54, 0xFF, 0xD1, 0x9E, 0x54, 0xFF, 0xD2, 0x9E, 0x54, 0xFF, 0xD2, 0x9E, 0x54, 0xFF, 0xD2, 0x9E, + 0x53, 0xFF, 0xD2, 0x9D, 0x53, 0xFF, 0xD1, 0x9D, 0x53, 0xFF, 0xD1, 0x9E, 0x55, 0xFF, 0xD2, 0xA0, + 0x5B, 0xFF, 0xD6, 0xA8, 0x69, 0xFF, 0xDD, 0xB6, 0x7F, 0xFF, 0xDF, 0xC0, 0x94, 0xE9, 0xD9, 0xC0, + 0x9F, 0x77, 0xD9, 0xC2, 0xA2, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xE0, + 0xCB, 0x02, 0xF1, 0xDF, 0xC4, 0x23, 0xE0, 0xC2, 0x98, 0x95, 0xD6, 0xB0, 0x7C, 0xF2, 0xD4, 0xA7, + 0x6E, 0xFF, 0xD0, 0x9D, 0x60, 0xFF, 0xCB, 0x97, 0x56, 0xFF, 0xCC, 0x96, 0x53, 0xFF, 0xCC, 0x98, + 0x53, 0xFF, 0xCE, 0x99, 0x53, 0xFF, 0xCE, 0x9B, 0x53, 0xFF, 0xD0, 0x9C, 0x54, 0xFF, 0xD1, 0x9D, + 0x55, 0xFF, 0xD2, 0x9E, 0x56, 0xFF, 0xD2, 0x9F, 0x56, 0xFF, 0xD3, 0xA0, 0x56, 0xFF, 0xD3, 0xA0, + 0x56, 0xFF, 0xD3, 0xA1, 0x56, 0xFF, 0xD3, 0xA1, 0x56, 0xFF, 0xD4, 0xA1, 0x56, 0xFF, 0xD3, 0xA1, + 0x56, 0xFF, 0xD5, 0xA4, 0x5C, 0xFF, 0xDA, 0xB1, 0x73, 0xFF, 0xDE, 0xB9, 0x83, 0xFF, 0xDE, 0xBB, + 0x85, 0xFF, 0xDE, 0xBB, 0x84, 0xFF, 0xDE, 0xBA, 0x84, 0xFF, 0xDE, 0xBA, 0x84, 0xFF, 0xDE, 0xBA, + 0x83, 0xFF, 0xDE, 0xBA, 0x83, 0xFF, 0xDE, 0xBA, 0x83, 0xFF, 0xDE, 0xBA, 0x84, 0xFF, 0xDE, 0xBA, + 0x83, 0xFF, 0xDE, 0xBA, 0x83, 0xFF, 0xDE, 0xBA, 0x83, 0xFF, 0xDE, 0xBA, 0x83, 0xFF, 0xDE, 0xBA, + 0x83, 0xFF, 0xDE, 0xBA, 0x83, 0xFF, 0xDE, 0xBA, 0x83, 0xFF, 0xDE, 0xBA, 0x84, 0xFF, 0xDE, 0xBA, + 0x83, 0xFF, 0xDE, 0xBA, 0x84, 0xFF, 0xDE, 0xBA, 0x83, 0xFF, 0xDE, 0xBA, 0x83, 0xFF, 0xDE, 0xBA, + 0x84, 0xFF, 0xDE, 0xBA, 0x83, 0xFF, 0xDE, 0xBA, 0x84, 0xFF, 0xDB, 0xB8, 0x83, 0xFF, 0xD7, 0xB7, + 0x83, 0xFF, 0xDA, 0xB9, 0x8B, 0xFF, 0xDB, 0xC4, 0xA0, 0xFF, 0xE7, 0xE0, 0xD6, 0xFF, 0xEE, 0xEE, + 0xEC, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF0, 0xF1, 0xF2, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xF0, 0xF2, + 0xF1, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xED, 0xED, 0xEE, 0xFF, 0xEC, 0xEC, 0xED, 0xFF, 0xEC, 0xEC, + 0xEC, 0xFF, 0xEB, 0xEC, 0xEB, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, + 0xEC, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEA, 0xEB, + 0xEB, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xE6, 0xE6, 0xE2, 0xFF, 0xE3, 0xE3, 0xDF, 0xFF, 0xE9, 0xEA, + 0xE7, 0xFF, 0xED, 0xED, 0xEC, 0xFF, 0xEC, 0xEE, 0xED, 0xFF, 0xEC, 0xED, 0xED, 0xFF, 0xF0, 0xF0, + 0xF1, 0xFF, 0xF3, 0xF2, 0xF1, 0xFF, 0xE4, 0xE2, 0xD8, 0xFF, 0xC9, 0xC5, 0xB4, 0xFF, 0xD1, 0xCA, + 0xB9, 0xFF, 0xD9, 0xD2, 0xBD, 0xFF, 0xD3, 0xC7, 0xAB, 0xFF, 0xBA, 0xA1, 0x74, 0xFF, 0xB7, 0x92, + 0x58, 0xFF, 0xC1, 0x97, 0x53, 0xFF, 0xCA, 0x9C, 0x53, 0xFF, 0xCF, 0x9F, 0x55, 0xFF, 0xD1, 0xA0, + 0x56, 0xFF, 0xD3, 0xA1, 0x56, 0xFF, 0xD3, 0xA1, 0x56, 0xFF, 0xD3, 0xA0, 0x56, 0xFF, 0xD3, 0x9F, + 0x55, 0xFF, 0xD3, 0x9F, 0x55, 0xFF, 0xD2, 0xA0, 0x56, 0xFF, 0xD3, 0xA1, 0x59, 0xFF, 0xD3, 0xA4, + 0x61, 0xFF, 0xDA, 0xAF, 0x74, 0xFF, 0xE3, 0xBC, 0x86, 0xFC, 0xDE, 0xC3, 0x9A, 0xCE, 0xD7, 0xC1, + 0xA5, 0x50, 0xD7, 0xC2, 0xA5, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFD, 0xFF, 0x0B, 0xE9, 0xCE, 0xA9, 0x67, 0xD6, 0xB1, 0x7C, 0xDC, 0xD8, 0xAE, + 0x7A, 0xFF, 0xD3, 0xA3, 0x68, 0xFF, 0xCE, 0x9A, 0x5B, 0xFF, 0xCF, 0x9A, 0x57, 0xFF, 0xCE, 0x9A, + 0x55, 0xFF, 0xD0, 0x9B, 0x55, 0xFF, 0xD1, 0x9D, 0x56, 0xFF, 0xD2, 0x9E, 0x57, 0xFF, 0xD2, 0xA0, + 0x58, 0xFF, 0xD3, 0xA1, 0x58, 0xFF, 0xD3, 0xA1, 0x58, 0xFF, 0xD4, 0xA2, 0x58, 0xFF, 0xD4, 0xA3, + 0x58, 0xFF, 0xD4, 0xA3, 0x58, 0xFF, 0xD4, 0xA3, 0x58, 0xFF, 0xD5, 0xA3, 0x58, 0xFF, 0xD5, 0xA3, + 0x59, 0xFF, 0xD8, 0xA7, 0x61, 0xFF, 0xDD, 0xB6, 0x7B, 0xFF, 0xE0, 0xBD, 0x87, 0xFF, 0xDF, 0xBD, + 0x88, 0xFF, 0xE0, 0xBD, 0x88, 0xFF, 0xDF, 0xBD, 0x87, 0xFF, 0xE0, 0xBD, 0x87, 0xFF, 0xDF, 0xBD, + 0x87, 0xFF, 0xE0, 0xBD, 0x87, 0xFF, 0xDF, 0xBD, 0x87, 0xFF, 0xE0, 0xBD, 0x87, 0xFF, 0xDF, 0xBD, + 0x87, 0xFF, 0xE0, 0xBD, 0x87, 0xFF, 0xDF, 0xBD, 0x87, 0xFF, 0xE0, 0xBD, 0x87, 0xFF, 0xDF, 0xBD, + 0x87, 0xFF, 0xE0, 0xBD, 0x87, 0xFF, 0xDF, 0xBD, 0x87, 0xFF, 0xE0, 0xBD, 0x87, 0xFF, 0xDF, 0xBD, + 0x87, 0xFF, 0xE0, 0xBD, 0x87, 0xFF, 0xDF, 0xBD, 0x87, 0xFF, 0xE0, 0xBD, 0x87, 0xFF, 0xDF, 0xBD, + 0x86, 0xFF, 0xE0, 0xBD, 0x87, 0xFF, 0xE0, 0xBC, 0x86, 0xFF, 0xDF, 0xBC, 0x87, 0xFF, 0xDC, 0xBA, + 0x85, 0xFF, 0xDA, 0xB9, 0x86, 0xFF, 0xD8, 0xBB, 0x8E, 0xFF, 0xDB, 0xC7, 0xA8, 0xFF, 0xE6, 0xE1, + 0xD7, 0xFF, 0xF2, 0xEF, 0xEC, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF0, 0xF2, + 0xF2, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF0, 0xF1, 0xF2, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xEF, 0xF0, + 0xF0, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEC, 0xED, + 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, + 0xEE, 0xFF, 0xED, 0xED, 0xEE, 0xFF, 0xEC, 0xED, 0xED, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEC, 0xED, + 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xEE, 0xFF, 0xEC, 0xED, + 0xEB, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, 0xE2, 0xE3, 0xDD, 0xFF, 0xEA, 0xEB, 0xE9, 0xFF, 0xEF, 0xF0, + 0xF0, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, + 0xEE, 0xFF, 0xEF, 0xEF, 0xF0, 0xFF, 0xF2, 0xF3, 0xF2, 0xFF, 0xEA, 0xE8, 0xE2, 0xFF, 0xD6, 0xD0, + 0xC2, 0xFF, 0xD3, 0xCC, 0xBA, 0xFF, 0xDE, 0xD7, 0xC3, 0xFF, 0xD7, 0xCA, 0xAF, 0xFF, 0xBC, 0xA0, + 0x6E, 0xFF, 0xBE, 0x97, 0x54, 0xFF, 0xC9, 0x9C, 0x55, 0xFF, 0xCF, 0xA0, 0x58, 0xFF, 0xD2, 0xA2, + 0x58, 0xFF, 0xD4, 0xA2, 0x58, 0xFF, 0xD4, 0xA2, 0x58, 0xFF, 0xD4, 0xA2, 0x58, 0xFF, 0xD4, 0xA2, + 0x58, 0xFF, 0xD4, 0xA2, 0x58, 0xFF, 0xD4, 0xA2, 0x58, 0xFF, 0xD5, 0xA4, 0x5D, 0xFF, 0xD7, 0xAA, + 0x69, 0xFF, 0xDE, 0xB6, 0x7E, 0xFF, 0xE7, 0xC1, 0x8B, 0xF5, 0xE0, 0xC5, 0xA1, 0xA7, 0xD5, 0xC3, + 0xAE, 0x2C, 0xD5, 0xC3, 0xAC, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFA, 0xFA, 0xFE, 0x02, 0xE5, 0xCA, 0x9F, 0x39, 0xD9, 0xB5, 0x80, 0xB8, 0xDA, 0xB3, + 0x80, 0xF8, 0xD8, 0xAA, 0x72, 0xFF, 0xD2, 0x9F, 0x61, 0xFF, 0xD1, 0x9C, 0x5A, 0xFF, 0xD0, 0x9C, + 0x57, 0xFF, 0xD2, 0x9D, 0x57, 0xFF, 0xD2, 0x9F, 0x58, 0xFF, 0xD4, 0xA0, 0x59, 0xFF, 0xD4, 0xA1, + 0x5A, 0xFF, 0xD4, 0xA2, 0x5A, 0xFF, 0xD5, 0xA3, 0x5A, 0xFF, 0xD6, 0xA4, 0x5A, 0xFF, 0xD6, 0xA4, + 0x5A, 0xFF, 0xD7, 0xA5, 0x5A, 0xFF, 0xD6, 0xA5, 0x5A, 0xFF, 0xD7, 0xA5, 0x5A, 0xFF, 0xD6, 0xA5, + 0x5C, 0xFF, 0xDA, 0xAB, 0x67, 0xFF, 0xDF, 0xBA, 0x82, 0xFF, 0xE2, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, + 0x8B, 0xFF, 0xE1, 0xBF, 0x8B, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, + 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, + 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, + 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, + 0x8A, 0xFF, 0xE2, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, + 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBE, 0x89, 0xFF, 0xE1, 0xBE, + 0x89, 0xFF, 0xDF, 0xBD, 0x89, 0xFF, 0xD9, 0xBB, 0x8A, 0xFF, 0xD9, 0xBE, 0x91, 0xFF, 0xDC, 0xCC, + 0xAD, 0xFF, 0xEA, 0xE4, 0xDC, 0xFF, 0xF1, 0xF0, 0xEE, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF3, + 0xF3, 0xFF, 0xF1, 0xF3, 0xF3, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF0, 0xF2, + 0xF2, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xEF, 0xEF, 0xF0, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xED, 0xEE, 0xEC, 0xFF, 0xE6, 0xE6, + 0xE0, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, 0xEE, 0xEF, 0xED, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xF0, 0xF0, + 0xF1, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xEF, 0xF0, 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, + 0xF0, 0xFF, 0xF0, 0xF0, 0xF1, 0xFF, 0xF5, 0xF5, 0xF6, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xE8, 0xE7, + 0xE1, 0xFF, 0xDC, 0xDA, 0xD1, 0xFF, 0xE4, 0xE1, 0xD7, 0xFF, 0xEA, 0xE1, 0xD3, 0xFF, 0xC8, 0xB1, + 0x8A, 0xFF, 0xC1, 0x9A, 0x57, 0xFF, 0xCA, 0x9F, 0x59, 0xFF, 0xD0, 0xA1, 0x5A, 0xFF, 0xD4, 0xA3, + 0x5A, 0xFF, 0xD6, 0xA4, 0x5A, 0xFF, 0xD6, 0xA4, 0x59, 0xFF, 0xD6, 0xA4, 0x59, 0xFF, 0xD6, 0xA4, + 0x59, 0xFF, 0xD7, 0xA5, 0x5A, 0xFF, 0xD6, 0xA4, 0x5C, 0xFF, 0xD6, 0xA7, 0x62, 0xFF, 0xD9, 0xAF, + 0x70, 0xFF, 0xE2, 0xBB, 0x86, 0xFE, 0xE8, 0xC7, 0x93, 0xE3, 0xE0, 0xC6, 0xA5, 0x75, 0xDA, 0xC5, + 0xAD, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE1, 0xC5, 0x96, 0x19, 0xE4, 0xC2, 0x91, 0x8C, 0xDC, 0xB6, + 0x83, 0xE5, 0xDB, 0xB0, 0x79, 0xFF, 0xD6, 0xA6, 0x69, 0xFF, 0xD3, 0xA0, 0x5F, 0xFF, 0xD2, 0x9F, + 0x5B, 0xFF, 0xD3, 0x9F, 0x5A, 0xFF, 0xD4, 0xA0, 0x5B, 0xFF, 0xD5, 0xA2, 0x5B, 0xFF, 0xD5, 0xA3, + 0x5C, 0xFF, 0xD6, 0xA4, 0x5D, 0xFF, 0xD7, 0xA5, 0x5D, 0xFF, 0xD8, 0xA6, 0x5D, 0xFF, 0xD8, 0xA7, + 0x5D, 0xFF, 0xD9, 0xA7, 0x5D, 0xFF, 0xD9, 0xA7, 0x5C, 0xFF, 0xD9, 0xA7, 0x5C, 0xFF, 0xD8, 0xA8, + 0x5F, 0xFF, 0xDC, 0xB0, 0x6C, 0xFF, 0xE1, 0xBE, 0x87, 0xFF, 0xE3, 0xC2, 0x8E, 0xFF, 0xE3, 0xC1, + 0x8E, 0xFF, 0xE4, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, + 0x8E, 0xFF, 0xE3, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, + 0x8E, 0xFF, 0xE3, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, + 0x8E, 0xFF, 0xE3, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, 0x8D, 0xFF, 0xE3, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, + 0x8E, 0xFF, 0xE3, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, 0x8D, 0xFF, 0xE4, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, + 0x8D, 0xFF, 0xE3, 0xC1, 0x8D, 0xFF, 0xE3, 0xC1, 0x8D, 0xFF, 0xE3, 0xC1, 0x8D, 0xFF, 0xE2, 0xC0, + 0x8D, 0xFF, 0xE2, 0xC0, 0x8D, 0xFF, 0xDF, 0xBF, 0x8D, 0xFF, 0xDB, 0xBE, 0x8D, 0xFF, 0xD8, 0xC1, + 0x95, 0xFF, 0xDF, 0xCF, 0xB4, 0xFF, 0xE9, 0xE5, 0xDE, 0xFF, 0xF3, 0xF1, 0xEF, 0xFF, 0xF2, 0xF3, + 0xF3, 0xFF, 0xF2, 0xF4, 0xF4, 0xFF, 0xF1, 0xF3, 0xF3, 0xFF, 0xF1, 0xF3, 0xF3, 0xFF, 0xF2, 0xF3, + 0xF3, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, 0xF1, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF0, 0xF1, + 0xF1, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xEF, 0xF0, 0xEF, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xEF, 0xF0, + 0xF0, 0xFF, 0xF0, 0xF0, 0xF1, 0xFF, 0xEF, 0xF0, 0xF1, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xF0, 0xF1, + 0xF1, 0xFF, 0xF0, 0xF0, 0xF1, 0xFF, 0xED, 0xEE, 0xED, 0xFF, 0xE6, 0xE7, 0xE2, 0xFF, 0xE5, 0xE6, + 0xE1, 0xFF, 0xEF, 0xEF, 0xEE, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xEF, 0xF0, + 0xF1, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xF0, 0xF1, 0xF0, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xED, 0xED, + 0xEA, 0xFF, 0xEA, 0xE9, 0xE4, 0xFF, 0xF1, 0xF1, 0xF0, 0xFF, 0xF4, 0xF3, 0xF3, 0xFF, 0xF0, 0xF1, + 0xF0, 0xFF, 0xEC, 0xEB, 0xE8, 0xFF, 0xEA, 0xE7, 0xE0, 0xFF, 0xEA, 0xE1, 0xD4, 0xFF, 0xCA, 0xB3, + 0x88, 0xFF, 0xC5, 0x9E, 0x5B, 0xFF, 0xCD, 0xA1, 0x5B, 0xFF, 0xD3, 0xA4, 0x5D, 0xFF, 0xD6, 0xA6, + 0x5D, 0xFF, 0xD8, 0xA6, 0x5C, 0xFF, 0xD8, 0xA6, 0x5C, 0xFF, 0xD8, 0xA7, 0x5C, 0xFF, 0xD8, 0xA7, + 0x5C, 0xFF, 0xD9, 0xA7, 0x5D, 0xFF, 0xD8, 0xA8, 0x60, 0xFF, 0xD8, 0xAC, 0x68, 0xFF, 0xDC, 0xB5, + 0x77, 0xFF, 0xE3, 0xC1, 0x8E, 0xFB, 0xE6, 0xCB, 0x9E, 0xC5, 0xE3, 0xCB, 0xA8, 0x42, 0xE1, 0xC7, + 0xAB, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0xD7, 0xB8, 0x09, 0xEC, 0xD1, 0xB0, 0x58, 0xE0, 0xBD, + 0x8D, 0xC3, 0xDE, 0xB5, 0x7F, 0xFD, 0xDB, 0xAE, 0x73, 0xFF, 0xD5, 0xA4, 0x65, 0xFF, 0xD3, 0xA1, + 0x5E, 0xFF, 0xD5, 0xA1, 0x5D, 0xFF, 0xD5, 0xA2, 0x5C, 0xFF, 0xD6, 0xA3, 0x5D, 0xFF, 0xD7, 0xA5, + 0x5E, 0xFF, 0xD8, 0xA6, 0x5E, 0xFF, 0xD8, 0xA7, 0x5F, 0xFF, 0xDA, 0xA8, 0x5F, 0xFF, 0xDA, 0xA8, + 0x5F, 0xFF, 0xDA, 0xA9, 0x5E, 0xFF, 0xDA, 0xA9, 0x5E, 0xFF, 0xDB, 0xA9, 0x5E, 0xFF, 0xDA, 0xAA, + 0x61, 0xFF, 0xDE, 0xB4, 0x72, 0xFF, 0xE3, 0xC1, 0x8C, 0xFF, 0xE6, 0xC4, 0x91, 0xFF, 0xE5, 0xC3, + 0x90, 0xFF, 0xE5, 0xC3, 0x91, 0xFF, 0xE5, 0xC3, 0x91, 0xFF, 0xE5, 0xC3, 0x91, 0xFF, 0xE5, 0xC3, + 0x91, 0xFF, 0xE5, 0xC3, 0x91, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, + 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, + 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, + 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, + 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, + 0x91, 0xFF, 0xE4, 0xC3, 0x90, 0xFF, 0xE3, 0xC3, 0x90, 0xFF, 0xE1, 0xC1, 0x90, 0xFF, 0xDB, 0xC0, + 0x90, 0xFF, 0xDD, 0xC3, 0x99, 0xFF, 0xE1, 0xD2, 0xB7, 0xFF, 0xED, 0xE8, 0xE0, 0xFF, 0xF3, 0xF3, + 0xF1, 0xFF, 0xF3, 0xF4, 0xF4, 0xFF, 0xF3, 0xF4, 0xF5, 0xFF, 0xF2, 0xF4, 0xF4, 0xFF, 0xF3, 0xF4, + 0xF4, 0xFF, 0xF3, 0xF4, 0xF4, 0xFF, 0xF2, 0xF3, 0xF3, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, + 0xF2, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xF1, 0xF2, + 0xF1, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, 0xF3, 0xFF, 0xF1, 0xF1, 0xF2, 0xFF, 0xF1, 0xF2, + 0xF3, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xF0, 0xF1, + 0xEF, 0xFF, 0xF2, 0xF3, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, + 0xF2, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xEF, 0xFF, 0xE1, 0xDF, + 0xCD, 0xFF, 0xC8, 0xC3, 0xB0, 0xFF, 0xE6, 0xE5, 0xDB, 0xFF, 0xF2, 0xF1, 0xED, 0xFF, 0xF1, 0xF2, + 0xF1, 0xFF, 0xF0, 0xF1, 0xF0, 0xFF, 0xEF, 0xEC, 0xE5, 0xFF, 0xE4, 0xD6, 0xC1, 0xFF, 0xC6, 0xA9, + 0x75, 0xFF, 0xCA, 0xA1, 0x5C, 0xFF, 0xD1, 0xA5, 0x5E, 0xFF, 0xD5, 0xA6, 0x5F, 0xFF, 0xD8, 0xA8, + 0x5F, 0xFF, 0xDA, 0xA8, 0x5E, 0xFF, 0xDA, 0xA8, 0x5E, 0xFF, 0xDB, 0xA9, 0x5E, 0xFF, 0xDA, 0xA9, + 0x5E, 0xFF, 0xDA, 0xA9, 0x60, 0xFF, 0xDA, 0xAB, 0x64, 0xFF, 0xDE, 0xB2, 0x73, 0xFF, 0xE2, 0xBD, + 0x87, 0xFE, 0xE7, 0xC5, 0x97, 0xF1, 0xE9, 0xCD, 0xA4, 0x8F, 0xE8, 0xCE, 0xA8, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xDE, 0xC9, 0x01, 0xE9, 0xD4, 0xBA, 0x28, 0xE5, 0xC3, + 0x94, 0x99, 0xE0, 0xBA, 0x86, 0xF0, 0xDE, 0xB4, 0x7B, 0xFF, 0xD9, 0xAA, 0x6E, 0xFF, 0xD6, 0xA5, + 0x63, 0xFF, 0xD7, 0xA4, 0x60, 0xFF, 0xD7, 0xA4, 0x5F, 0xFF, 0xD8, 0xA5, 0x5F, 0xFF, 0xD8, 0xA7, + 0x60, 0xFF, 0xD9, 0xA9, 0x61, 0xFF, 0xD9, 0xAA, 0x61, 0xFF, 0xDA, 0xAA, 0x61, 0xFF, 0xDA, 0xAB, + 0x61, 0xFF, 0xDB, 0xAB, 0x61, 0xFF, 0xDC, 0xAB, 0x60, 0xFF, 0xDC, 0xAB, 0x60, 0xFF, 0xDB, 0xAC, + 0x63, 0xFF, 0xDF, 0xB6, 0x76, 0xFF, 0xE5, 0xC4, 0x91, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE7, 0xC6, + 0x94, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE6, 0xC6, 0x94, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE6, 0xC6, + 0x94, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE6, 0xC6, 0x94, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE6, 0xC6, + 0x94, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE6, 0xC6, 0x94, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE6, 0xC6, + 0x94, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE6, 0xC6, 0x94, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE6, 0xC6, + 0x94, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE6, 0xC6, 0x94, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE6, 0xC6, + 0x94, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE6, 0xC6, 0x94, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE6, 0xC6, + 0x94, 0xFF, 0xE6, 0xC6, 0x94, 0xFF, 0xE5, 0xC5, 0x93, 0xFF, 0xE5, 0xC5, 0x94, 0xFF, 0xE2, 0xC3, + 0x92, 0xFF, 0xDE, 0xC2, 0x92, 0xFF, 0xDC, 0xC6, 0x9C, 0xFF, 0xE4, 0xD3, 0xBA, 0xFF, 0xEC, 0xE9, + 0xE0, 0xFF, 0xF5, 0xF4, 0xF1, 0xFF, 0xF4, 0xF5, 0xF5, 0xFF, 0xF4, 0xF5, 0xF5, 0xFF, 0xF3, 0xF5, + 0xF5, 0xFF, 0xF3, 0xF5, 0xF5, 0xFF, 0xF3, 0xF4, 0xF4, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF2, 0xF3, + 0xF3, 0xFF, 0xF2, 0xF2, 0xF3, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, 0xF3, 0xFF, 0xF1, 0xF2, + 0xF2, 0xFF, 0xF2, 0xF3, 0xF2, 0xFF, 0xF2, 0xF3, 0xF3, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF0, 0xF1, + 0xF1, 0xFF, 0xEC, 0xED, 0xEA, 0xFF, 0xED, 0xEE, 0xEA, 0xFF, 0xF2, 0xF3, 0xF2, 0xFF, 0xF2, 0xF3, + 0xF2, 0xFF, 0xF2, 0xF3, 0xF3, 0xFF, 0xF2, 0xF3, 0xF3, 0xFF, 0xF2, 0xF3, 0xF3, 0xFF, 0xF1, 0xF2, + 0xF3, 0xFF, 0xF2, 0xF3, 0xF3, 0xFF, 0xF2, 0xF3, 0xF1, 0xFF, 0xE5, 0xE3, 0xD7, 0xFF, 0xBA, 0xB4, + 0x9D, 0xFF, 0xC6, 0xC2, 0xAF, 0xFF, 0xEF, 0xEE, 0xE6, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF4, 0xF4, + 0xF4, 0xFF, 0xF2, 0xF1, 0xF0, 0xFF, 0xF0, 0xE7, 0xDB, 0xFF, 0xD3, 0xBE, 0x96, 0xFF, 0xC6, 0xA3, + 0x67, 0xFF, 0xCF, 0xA5, 0x60, 0xFF, 0xD5, 0xA9, 0x62, 0xFF, 0xD9, 0xAA, 0x61, 0xFF, 0xDB, 0xAA, + 0x61, 0xFF, 0xDC, 0xAA, 0x60, 0xFF, 0xDC, 0xAB, 0x61, 0xFF, 0xDC, 0xAB, 0x61, 0xFF, 0xDB, 0xAB, + 0x61, 0xFF, 0xDB, 0xAC, 0x65, 0xFF, 0xDD, 0xAF, 0x6C, 0xFF, 0xE2, 0xBA, 0x80, 0xFF, 0xE7, 0xC5, + 0x92, 0xFE, 0xEE, 0xCA, 0x9D, 0xD3, 0xF1, 0xCF, 0xA5, 0x55, 0xE9, 0xD3, 0xA4, 0x0D, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE2, 0xCC, 0xAE, 0x0E, 0xE3, 0xC3, + 0x96, 0x5C, 0xE2, 0xBE, 0x8C, 0xD2, 0xE1, 0xB9, 0x83, 0xFE, 0xDD, 0xB1, 0x76, 0xFF, 0xD9, 0xA9, + 0x68, 0xFF, 0xD9, 0xA7, 0x62, 0xFF, 0xD9, 0xA6, 0x61, 0xFF, 0xD9, 0xA7, 0x61, 0xFF, 0xD9, 0xA9, + 0x61, 0xFF, 0xDA, 0xAA, 0x62, 0xFF, 0xDB, 0xAB, 0x63, 0xFF, 0xDC, 0xAC, 0x63, 0xFF, 0xDC, 0xAC, + 0x63, 0xFF, 0xDD, 0xAD, 0x63, 0xFF, 0xDD, 0xAD, 0x63, 0xFF, 0xDD, 0xAD, 0x62, 0xFF, 0xDD, 0xAF, + 0x65, 0xFF, 0xE1, 0xB8, 0x79, 0xFF, 0xE7, 0xC6, 0x93, 0xFF, 0xE9, 0xC8, 0x97, 0xFF, 0xE8, 0xC8, + 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, + 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, + 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, + 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, + 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, + 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, + 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE7, 0xC7, 0x96, 0xFF, 0xE6, 0xC7, + 0x95, 0xFF, 0xE4, 0xC5, 0x95, 0xFF, 0xDF, 0xC4, 0x96, 0xFF, 0xE2, 0xC9, 0xA0, 0xFF, 0xE5, 0xD6, + 0xBC, 0xFF, 0xF0, 0xEA, 0xE2, 0xFF, 0xF5, 0xF4, 0xF3, 0xFF, 0xF5, 0xF5, 0xF5, 0xFF, 0xF5, 0xF6, + 0xF6, 0xFF, 0xF4, 0xF5, 0xF6, 0xFF, 0xF4, 0xF5, 0xF5, 0xFF, 0xF4, 0xF5, 0xF5, 0xFF, 0xF3, 0xF4, + 0xF4, 0xFF, 0xF3, 0xF4, 0xF4, 0xFF, 0xF3, 0xF4, 0xF4, 0xFF, 0xF3, 0xF4, 0xF4, 0xFF, 0xF2, 0xF4, + 0xF4, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF4, 0xF4, 0xF3, 0xFF, 0xF3, 0xF3, 0xF2, 0xFF, 0xF1, 0xF2, + 0xF0, 0xFF, 0xF0, 0xF1, 0xEF, 0xFF, 0xF3, 0xF4, 0xF3, 0xFF, 0xF5, 0xF5, 0xF5, 0xFF, 0xF4, 0xF4, + 0xF4, 0xFF, 0xF4, 0xF4, 0xF4, 0xFF, 0xF3, 0xF4, 0xF4, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF2, 0xF4, + 0xF4, 0xFF, 0xF3, 0xF5, 0xF5, 0xFF, 0xEE, 0xEF, 0xEA, 0xFF, 0xCE, 0xCB, 0xBB, 0xFF, 0xBD, 0xB8, + 0xA5, 0xFF, 0xE3, 0xE0, 0xD3, 0xFF, 0xF5, 0xF4, 0xF2, 0xFF, 0xF5, 0xF5, 0xF5, 0xFF, 0xF5, 0xF5, + 0xF3, 0xFF, 0xF0, 0xEA, 0xE3, 0xFF, 0xD9, 0xC9, 0xAA, 0xFF, 0xC7, 0xA8, 0x72, 0xFF, 0xCC, 0xA5, + 0x62, 0xFF, 0xD4, 0xA9, 0x63, 0xFF, 0xD8, 0xAB, 0x63, 0xFF, 0xDC, 0xAC, 0x62, 0xFF, 0xDC, 0xAC, + 0x62, 0xFF, 0xDD, 0xAD, 0x62, 0xFF, 0xDD, 0xAC, 0x62, 0xFF, 0xDD, 0xAC, 0x63, 0xFF, 0xDC, 0xAD, + 0x64, 0xFF, 0xDD, 0xAF, 0x6A, 0xFF, 0xDE, 0xB3, 0x74, 0xFF, 0xE7, 0xC4, 0x8E, 0xFF, 0xEC, 0xCB, + 0x97, 0xF4, 0xEB, 0xCB, 0xA1, 0x9A, 0xE2, 0xCA, 0xA7, 0x27, 0xC0, 0xC5, 0xB6, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE2, 0xC8, 0xA2, 0x01, 0xE1, 0xC5, + 0x9C, 0x29, 0xE5, 0xC2, 0x93, 0xA2, 0xE3, 0xBE, 0x8A, 0xF0, 0xE1, 0xB7, 0x7F, 0xFF, 0xDC, 0xAF, + 0x70, 0xFF, 0xDA, 0xAA, 0x67, 0xFF, 0xDA, 0xA9, 0x63, 0xFF, 0xDB, 0xA9, 0x63, 0xFF, 0xDB, 0xAA, + 0x63, 0xFF, 0xDC, 0xAC, 0x64, 0xFF, 0xDC, 0xAC, 0x64, 0xFF, 0xDD, 0xAD, 0x65, 0xFF, 0xDD, 0xAE, + 0x65, 0xFF, 0xDE, 0xAE, 0x65, 0xFF, 0xDE, 0xAE, 0x64, 0xFF, 0xDE, 0xAF, 0x64, 0xFF, 0xDF, 0xB1, + 0x66, 0xFF, 0xE2, 0xBA, 0x7A, 0xFF, 0xE8, 0xC8, 0x95, 0xFF, 0xEA, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, + 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, + 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, + 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, + 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, + 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, + 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, + 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE8, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE8, 0xC9, + 0x98, 0xFF, 0xE8, 0xC9, 0x99, 0xFF, 0xE5, 0xC8, 0x98, 0xFF, 0xE3, 0xC7, 0x99, 0xFF, 0xE0, 0xCA, + 0xA2, 0xFF, 0xE5, 0xD5, 0xBC, 0xFF, 0xED, 0xE9, 0xE1, 0xFF, 0xF6, 0xF5, 0xF2, 0xFF, 0xF6, 0xF6, + 0xF6, 0xFF, 0xF6, 0xF6, 0xF7, 0xFF, 0xF5, 0xF6, 0xF7, 0xFF, 0xF5, 0xF6, 0xF7, 0xFF, 0xF5, 0xF6, + 0xF6, 0xFF, 0xF5, 0xF6, 0xF6, 0xFF, 0xF4, 0xF5, 0xF6, 0xFF, 0xF5, 0xF5, 0xF5, 0xFF, 0xF3, 0xF4, + 0xF5, 0xFF, 0xF5, 0xF5, 0xF4, 0xFF, 0xF6, 0xF6, 0xF3, 0xFF, 0xF5, 0xF5, 0xF3, 0xFF, 0xF3, 0xF5, + 0xF4, 0xFF, 0xF4, 0xF5, 0xF4, 0xFF, 0xF4, 0xF5, 0xF5, 0xFF, 0xF5, 0xF5, 0xF5, 0xFF, 0xF4, 0xF5, + 0xF5, 0xFF, 0xF5, 0xF5, 0xF6, 0xFF, 0xF3, 0xF4, 0xF5, 0xFF, 0xF4, 0xF5, 0xF5, 0xFF, 0xF5, 0xF6, + 0xF5, 0xFF, 0xF3, 0xF4, 0xF5, 0xFF, 0xEF, 0xF0, 0xED, 0xFF, 0xE3, 0xE3, 0xDA, 0xFF, 0xE5, 0xE3, + 0xDB, 0xFF, 0xF8, 0xF8, 0xF4, 0xFF, 0xF8, 0xF9, 0xF8, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xF5, 0xEE, + 0xE6, 0xFF, 0xDC, 0xCB, 0xAC, 0xFF, 0xC9, 0xAC, 0x78, 0xFF, 0xCC, 0xA6, 0x63, 0xFF, 0xD3, 0xAA, + 0x64, 0xFF, 0xD9, 0xAD, 0x64, 0xFF, 0xDC, 0xAF, 0x65, 0xFF, 0xDE, 0xAF, 0x65, 0xFF, 0xDF, 0xAF, + 0x64, 0xFF, 0xDF, 0xAF, 0x65, 0xFF, 0xDE, 0xAF, 0x65, 0xFF, 0xDF, 0xAF, 0x66, 0xFF, 0xE0, 0xB1, + 0x69, 0xFF, 0xE1, 0xB3, 0x71, 0xFF, 0xDE, 0xBA, 0x82, 0xFF, 0xEA, 0xCA, 0x97, 0xFE, 0xF1, 0xCE, + 0x98, 0xD6, 0xE5, 0xCA, 0xA9, 0x5A, 0x49, 0xAC, 0xFD, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xC7, + 0xA3, 0x10, 0xE3, 0xC4, 0x9A, 0x61, 0xE5, 0xC2, 0x8F, 0xCE, 0xE5, 0xBD, 0x87, 0xFF, 0xE1, 0xB5, + 0x7A, 0xFF, 0xDD, 0xAE, 0x6D, 0xFF, 0xDB, 0xAB, 0x66, 0xFF, 0xDD, 0xAB, 0x65, 0xFF, 0xDC, 0xAC, + 0x65, 0xFF, 0xDD, 0xAD, 0x65, 0xFF, 0xDD, 0xAE, 0x66, 0xFF, 0xDE, 0xAF, 0x67, 0xFF, 0xDE, 0xAF, + 0x67, 0xFF, 0xDF, 0xB0, 0x67, 0xFF, 0xDF, 0xB0, 0x66, 0xFF, 0xE0, 0xB0, 0x66, 0xFF, 0xE1, 0xB2, + 0x68, 0xFF, 0xE4, 0xBB, 0x7C, 0xFF, 0xE9, 0xCA, 0x96, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCB, + 0x9C, 0xFF, 0xEA, 0xCB, 0x9C, 0xFF, 0xEA, 0xCB, 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCC, + 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCB, + 0x9B, 0xFF, 0xEA, 0xCB, 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCB, 0x9B, 0xFF, 0xEA, 0xCC, + 0x9B, 0xFF, 0xEA, 0xCB, 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCC, + 0x9B, 0xFF, 0xEA, 0xCB, 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCB, 0x9B, 0xFF, 0xEA, 0xCC, + 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCC, + 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xE9, 0xCC, 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCC, + 0x9C, 0xFF, 0xEA, 0xCB, 0x9B, 0xFF, 0xE9, 0xCB, 0x9B, 0xFF, 0xE6, 0xC9, 0x9B, 0xFF, 0xE2, 0xC9, + 0x9D, 0xFF, 0xE5, 0xCC, 0xA6, 0xFF, 0xE6, 0xD6, 0xBC, 0xFF, 0xF0, 0xE9, 0xE0, 0xFF, 0xF6, 0xF5, + 0xF3, 0xFF, 0xF7, 0xF7, 0xF7, 0xFF, 0xF7, 0xF7, 0xF8, 0xFF, 0xF6, 0xF8, 0xF8, 0xFF, 0xF6, 0xF8, + 0xF8, 0xFF, 0xF6, 0xF7, 0xF8, 0xFF, 0xF5, 0xF6, 0xF7, 0xFF, 0xF5, 0xF5, 0xF7, 0xFF, 0xF4, 0xF4, + 0xF4, 0xFF, 0xF1, 0xEF, 0xE8, 0xFF, 0xF1, 0xEF, 0xE9, 0xFF, 0xF7, 0xF6, 0xF4, 0xFF, 0xF6, 0xF7, + 0xF6, 0xFF, 0xF6, 0xF7, 0xF7, 0xFF, 0xF5, 0xF7, 0xF7, 0xFF, 0xF6, 0xF7, 0xF7, 0xFF, 0xF6, 0xF7, + 0xF7, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xF4, 0xF6, 0xF6, 0xFF, 0xF5, 0xF6, 0xF6, 0xFF, 0xF7, 0xF7, + 0xF7, 0xFF, 0xF7, 0xF8, 0xF8, 0xFF, 0xF8, 0xF9, 0xF9, 0xFF, 0xF6, 0xF7, 0xF7, 0xFF, 0xF7, 0xF8, + 0xF7, 0xFF, 0xF9, 0xFA, 0xFA, 0xFF, 0xF9, 0xFB, 0xFA, 0xFF, 0xF5, 0xF2, 0xEC, 0xFF, 0xE1, 0xD4, + 0xBB, 0xFF, 0xCC, 0xB0, 0x7D, 0xFF, 0xCC, 0xA7, 0x68, 0xFF, 0xD1, 0xA9, 0x62, 0xFF, 0xD7, 0xAD, + 0x65, 0xFF, 0xDD, 0xAF, 0x66, 0xFF, 0xDF, 0xB1, 0x67, 0xFF, 0xE0, 0xB1, 0x67, 0xFF, 0xE0, 0xB1, + 0x66, 0xFF, 0xE0, 0xB1, 0x67, 0xFF, 0xDF, 0xB0, 0x67, 0xFF, 0xE1, 0xB1, 0x69, 0xFF, 0xE3, 0xB4, + 0x6D, 0xFF, 0xE0, 0xB8, 0x78, 0xFF, 0xE3, 0xC4, 0x8E, 0xFF, 0xEF, 0xCA, 0x98, 0xF5, 0xF2, 0xD0, + 0xA3, 0x9A, 0xDA, 0xCB, 0xAF, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xCA, + 0xAF, 0x01, 0xE0, 0xC8, 0xA8, 0x2A, 0xE5, 0xC5, 0x95, 0x97, 0xE5, 0xC1, 0x8E, 0xEE, 0xE3, 0xBB, + 0x83, 0xFF, 0xE0, 0xB3, 0x75, 0xFF, 0xDE, 0xAE, 0x6C, 0xFF, 0xDE, 0xAD, 0x69, 0xFF, 0xDE, 0xAD, + 0x67, 0xFF, 0xDE, 0xAE, 0x67, 0xFF, 0xDF, 0xAF, 0x68, 0xFF, 0xE0, 0xB1, 0x68, 0xFF, 0xE0, 0xB1, + 0x69, 0xFF, 0xE1, 0xB2, 0x69, 0xFF, 0xE1, 0xB2, 0x68, 0xFF, 0xE1, 0xB2, 0x68, 0xFF, 0xE2, 0xB3, + 0x6A, 0xFF, 0xE5, 0xBB, 0x7A, 0xFF, 0xE9, 0xCA, 0x97, 0xFF, 0xEA, 0xCD, 0x9E, 0xFF, 0xEB, 0xCD, + 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCD, + 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCD, 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCD, + 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCD, 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCD, + 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCD, 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCD, + 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCD, 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCD, + 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCD, + 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCD, 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCD, + 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCC, 0x9E, 0xFF, 0xEA, 0xCC, 0x9F, 0xFF, 0xE8, 0xCC, + 0x9E, 0xFF, 0xE6, 0xCB, 0x9F, 0xFF, 0xE3, 0xCD, 0xA6, 0xFF, 0xE5, 0xD5, 0xB8, 0xFF, 0xEC, 0xE8, + 0xDC, 0xFF, 0xF6, 0xF5, 0xF1, 0xFF, 0xF8, 0xF8, 0xF8, 0xFF, 0xF8, 0xF9, 0xF9, 0xFF, 0xF6, 0xF8, + 0xF8, 0xFF, 0xF6, 0xF7, 0xF8, 0xFF, 0xF6, 0xF6, 0xF7, 0xFF, 0xF5, 0xF4, 0xF2, 0xFF, 0xEC, 0xE5, + 0xD6, 0xFF, 0xE2, 0xD7, 0xC0, 0xFF, 0xE2, 0xD9, 0xC5, 0xFF, 0xEF, 0xEC, 0xE3, 0xFF, 0xF8, 0xF7, + 0xF6, 0xFF, 0xF9, 0xF9, 0xF9, 0xFF, 0xF6, 0xF7, 0xF8, 0xFF, 0xF6, 0xF8, 0xF9, 0xFF, 0xF8, 0xF9, + 0xFA, 0xFF, 0xF8, 0xF9, 0xF9, 0xFF, 0xF7, 0xF8, 0xF8, 0xFF, 0xFA, 0xFA, 0xF7, 0xFF, 0xF8, 0xF9, + 0xF7, 0xFF, 0xF8, 0xFA, 0xF9, 0xFF, 0xF9, 0xFC, 0xFC, 0xFF, 0xF7, 0xF9, 0xFB, 0xFF, 0xF7, 0xF9, + 0xFA, 0xFF, 0xF8, 0xF9, 0xF9, 0xFF, 0xF9, 0xF6, 0xF2, 0xFF, 0xE8, 0xDF, 0xCE, 0xFF, 0xD4, 0xBE, + 0x95, 0xFF, 0xD1, 0xAD, 0x6F, 0xFF, 0xD6, 0xAD, 0x68, 0xFF, 0xDA, 0xAF, 0x66, 0xFF, 0xDE, 0xB2, + 0x67, 0xFF, 0xE1, 0xB3, 0x69, 0xFF, 0xE1, 0xB2, 0x68, 0xFF, 0xE2, 0xB3, 0x68, 0xFF, 0xE1, 0xB3, + 0x68, 0xFF, 0xE1, 0xB3, 0x69, 0xFF, 0xE1, 0xB2, 0x69, 0xFF, 0xE3, 0xB4, 0x6D, 0xFF, 0xE4, 0xBA, + 0x76, 0xFF, 0xE3, 0xBF, 0x84, 0xFF, 0xE8, 0xC9, 0x98, 0xFD, 0xEE, 0xCC, 0xA1, 0xD0, 0xEC, 0xD2, + 0xAF, 0x59, 0xE5, 0xD0, 0xB7, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xE0, 0xCB, 0xB1, 0x0D, 0xE6, 0xC9, 0x9D, 0x52, 0xE9, 0xC6, 0x93, 0xC7, 0xE7, 0xC1, + 0x8D, 0xFB, 0xE3, 0xB9, 0x81, 0xFF, 0xE0, 0xB3, 0x74, 0xFF, 0xE0, 0xB0, 0x6C, 0xFF, 0xDF, 0xAF, + 0x69, 0xFF, 0xDF, 0xB0, 0x69, 0xFF, 0xE0, 0xB1, 0x69, 0xFF, 0xE1, 0xB2, 0x6A, 0xFF, 0xE1, 0xB3, + 0x6A, 0xFF, 0xE2, 0xB4, 0x6B, 0xFF, 0xE2, 0xB4, 0x6A, 0xFF, 0xE3, 0xB4, 0x6B, 0xFF, 0xE4, 0xB5, + 0x6C, 0xFF, 0xE6, 0xBB, 0x79, 0xFF, 0xEA, 0xCA, 0x96, 0xFF, 0xEC, 0xCF, 0xA0, 0xFF, 0xEC, 0xCF, + 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, + 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, + 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, + 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, + 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, + 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, + 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, + 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA2, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEB, 0xCF, + 0xA1, 0xFF, 0xE9, 0xCD, 0xA0, 0xFF, 0xE6, 0xCD, 0xA1, 0xFF, 0xE7, 0xCE, 0xA6, 0xFF, 0xE8, 0xD6, + 0xB5, 0xFF, 0xEE, 0xE6, 0xD6, 0xFF, 0xF6, 0xF4, 0xEF, 0xFF, 0xF9, 0xF9, 0xF7, 0xFF, 0xF6, 0xF7, + 0xF6, 0xFF, 0xF7, 0xF8, 0xF9, 0xFF, 0xF6, 0xF7, 0xF6, 0xFF, 0xEA, 0xE0, 0xCD, 0xFF, 0xE1, 0xD0, + 0xAC, 0xFF, 0xDF, 0xCB, 0xA6, 0xFF, 0xE1, 0xCD, 0xA9, 0xFF, 0xE8, 0xD9, 0xBD, 0xFF, 0xF3, 0xEE, + 0xE3, 0xFF, 0xFA, 0xF9, 0xF6, 0xFF, 0xF8, 0xFA, 0xF9, 0xFF, 0xF8, 0xF9, 0xF9, 0xFF, 0xF8, 0xF9, + 0xFA, 0xFF, 0xFA, 0xFB, 0xFA, 0xFF, 0xF6, 0xF6, 0xF3, 0xFF, 0xE8, 0xE6, 0xDB, 0xFF, 0xE4, 0xE2, + 0xD7, 0xFF, 0xF2, 0xF1, 0xEB, 0xFF, 0xF8, 0xF9, 0xF9, 0xFF, 0xF7, 0xF9, 0xFA, 0xFF, 0xF8, 0xF9, + 0xF9, 0xFF, 0xF6, 0xF4, 0xEF, 0xFF, 0xEC, 0xE5, 0xD4, 0xFF, 0xDE, 0xCC, 0xAA, 0xFF, 0xD6, 0xB8, + 0x83, 0xFF, 0xD8, 0xB1, 0x6C, 0xFF, 0xDC, 0xB2, 0x6A, 0xFF, 0xDF, 0xB2, 0x69, 0xFF, 0xE1, 0xB4, + 0x6A, 0xFF, 0xE3, 0xB5, 0x6B, 0xFF, 0xE3, 0xB5, 0x6A, 0xFF, 0xE3, 0xB5, 0x6A, 0xFF, 0xE2, 0xB4, + 0x6A, 0xFF, 0xE2, 0xB5, 0x6B, 0xFF, 0xE2, 0xB4, 0x6C, 0xFF, 0xE4, 0xB8, 0x74, 0xFF, 0xE6, 0xC0, + 0x81, 0xFF, 0xE7, 0xC5, 0x8F, 0xFE, 0xEA, 0xCC, 0x9D, 0xE7, 0xEC, 0xD0, 0xA6, 0x8F, 0xEA, 0xD3, + 0xAE, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xDE, 0xCB, 0xB0, 0x01, 0xE3, 0xC8, 0xA3, 0x1E, 0xEC, 0xC9, 0x94, 0x88, 0xE7, 0xC5, + 0x93, 0xE2, 0xE7, 0xC1, 0x8A, 0xFF, 0xE4, 0xB9, 0x7D, 0xFF, 0xE2, 0xB5, 0x72, 0xFF, 0xE1, 0xB2, + 0x6D, 0xFF, 0xE1, 0xB2, 0x6C, 0xFF, 0xE1, 0xB2, 0x6C, 0xFF, 0xE2, 0xB4, 0x6C, 0xFF, 0xE2, 0xB5, + 0x6D, 0xFF, 0xE3, 0xB5, 0x6D, 0xFF, 0xE4, 0xB6, 0x6D, 0xFF, 0xE4, 0xB6, 0x6D, 0xFF, 0xE5, 0xB7, + 0x6E, 0xFF, 0xE6, 0xBC, 0x77, 0xFF, 0xEA, 0xC9, 0x92, 0xFF, 0xEE, 0xD1, 0xA2, 0xFF, 0xEE, 0xD1, + 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, + 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, + 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, + 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, + 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, + 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, + 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, + 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD0, + 0xA4, 0xFF, 0xED, 0xD0, 0xA3, 0xFF, 0xEA, 0xCF, 0xA2, 0xFF, 0xE8, 0xCE, 0xA3, 0xFF, 0xE7, 0xCF, + 0xA6, 0xFF, 0xE7, 0xD3, 0xAE, 0xFF, 0xE9, 0xDE, 0xC8, 0xFF, 0xF1, 0xEC, 0xE4, 0xFF, 0xF6, 0xF5, + 0xF2, 0xFF, 0xF7, 0xF4, 0xED, 0xFF, 0xEC, 0xE1, 0xCD, 0xFF, 0xE5, 0xD1, 0xAD, 0xFF, 0xE4, 0xCD, + 0xA5, 0xFF, 0xE4, 0xCE, 0xA4, 0xFF, 0xE4, 0xCC, 0xA1, 0xFF, 0xE5, 0xCF, 0xA9, 0xFF, 0xE9, 0xDB, + 0xBE, 0xFF, 0xF4, 0xEC, 0xDF, 0xFF, 0xFA, 0xFA, 0xF5, 0xFF, 0xFB, 0xFB, 0xFA, 0xFF, 0xF9, 0xFA, + 0xFA, 0xFF, 0xF8, 0xF8, 0xF7, 0xFF, 0xE6, 0xE5, 0xDA, 0xFF, 0xC7, 0xC4, 0xB2, 0xFF, 0xD3, 0xD1, + 0xC1, 0xFF, 0xF0, 0xEF, 0xE8, 0xFF, 0xF9, 0xFB, 0xFA, 0xFF, 0xF7, 0xF9, 0xFB, 0xFF, 0xF9, 0xF5, + 0xF1, 0xFF, 0xF0, 0xE7, 0xD6, 0xFF, 0xE2, 0xD1, 0xB5, 0xFF, 0xE1, 0xC7, 0x9D, 0xFF, 0xDC, 0xBB, + 0x82, 0xFF, 0xE0, 0xB6, 0x6F, 0xFF, 0xE2, 0xB6, 0x6C, 0xFF, 0xE3, 0xB5, 0x6C, 0xFF, 0xE3, 0xB7, + 0x6D, 0xFF, 0xE4, 0xB7, 0x6D, 0xFF, 0xE4, 0xB7, 0x6D, 0xFF, 0xE4, 0xB7, 0x6D, 0xFF, 0xE4, 0xB6, + 0x6D, 0xFF, 0xE4, 0xB7, 0x6F, 0xFF, 0xE4, 0xB9, 0x73, 0xFF, 0xE6, 0xBE, 0x7F, 0xFF, 0xE9, 0xC6, + 0x8C, 0xFF, 0xEC, 0xCC, 0x99, 0xF6, 0xED, 0xD1, 0xA5, 0xBA, 0xEB, 0xD1, 0xAA, 0x49, 0xE7, 0xD2, + 0xAE, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE1, 0xCC, 0xAC, 0x06, 0xE8, 0xCD, 0xA1, 0x40, 0xEA, 0xCB, + 0x95, 0xAD, 0xEB, 0xC4, 0x91, 0xF5, 0xE9, 0xC0, 0x87, 0xFF, 0xE5, 0xB9, 0x7C, 0xFF, 0xE2, 0xB5, + 0x72, 0xFF, 0xE2, 0xB4, 0x6E, 0xFF, 0xE2, 0xB4, 0x6D, 0xFF, 0xE3, 0xB5, 0x6E, 0xFF, 0xE3, 0xB6, + 0x6E, 0xFF, 0xE4, 0xB7, 0x6F, 0xFF, 0xE5, 0xB7, 0x6F, 0xFF, 0xE5, 0xB8, 0x6F, 0xFF, 0xE5, 0xB7, + 0x6F, 0xFF, 0xE8, 0xBB, 0x75, 0xFF, 0xEB, 0xC7, 0x8D, 0xFF, 0xEF, 0xD2, 0xA2, 0xFF, 0xF0, 0xD3, + 0xA6, 0xFF, 0xEF, 0xD3, 0xA7, 0xFF, 0xEF, 0xD3, 0xA7, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, + 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, + 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, + 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, + 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, + 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, + 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, + 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, + 0xA7, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEE, 0xD2, 0xA5, 0xFF, 0xED, 0xD1, 0xA5, 0xFF, 0xEC, 0xD2, + 0xA5, 0xFF, 0xED, 0xD2, 0xA7, 0xFF, 0xE9, 0xD1, 0xAC, 0xFF, 0xEB, 0xD8, 0xB9, 0xFF, 0xEF, 0xDD, + 0xC2, 0xFF, 0xED, 0xD9, 0xBA, 0xFF, 0xE6, 0xD1, 0xAB, 0xFF, 0xE6, 0xCE, 0xA6, 0xFF, 0xE8, 0xCF, + 0xA5, 0xFF, 0xE9, 0xD0, 0xA5, 0xFF, 0xE9, 0xD0, 0xA5, 0xFF, 0xE9, 0xD0, 0xA7, 0xFF, 0xE6, 0xD2, + 0xAE, 0xFF, 0xEC, 0xDA, 0xBC, 0xFF, 0xF4, 0xEC, 0xDE, 0xFF, 0xFA, 0xF9, 0xF5, 0xFF, 0xFA, 0xFA, + 0xFA, 0xFF, 0xF7, 0xF7, 0xF7, 0xFF, 0xE7, 0xE6, 0xDB, 0xFF, 0xD9, 0xD7, 0xC5, 0xFF, 0xE6, 0xE4, + 0xD9, 0xFF, 0xF6, 0xF8, 0xF4, 0xFF, 0xF8, 0xFA, 0xFC, 0xFF, 0xF7, 0xF6, 0xF6, 0xFF, 0xF1, 0xE9, + 0xD9, 0xFF, 0xE7, 0xD7, 0xB8, 0xFF, 0xE3, 0xCD, 0xA8, 0xFF, 0xE5, 0xC8, 0x99, 0xFF, 0xE0, 0xBB, + 0x7E, 0xFF, 0xE4, 0xB8, 0x70, 0xFF, 0xE4, 0xB8, 0x6F, 0xFF, 0xE5, 0xB8, 0x6E, 0xFF, 0xE6, 0xB9, + 0x6F, 0xFF, 0xE6, 0xB9, 0x6F, 0xFF, 0xE5, 0xB8, 0x6F, 0xFF, 0xE5, 0xB8, 0x70, 0xFF, 0xE5, 0xB8, + 0x70, 0xFF, 0xE5, 0xBA, 0x74, 0xFF, 0xE7, 0xBE, 0x7C, 0xFF, 0xE8, 0xC3, 0x88, 0xFF, 0xED, 0xCA, + 0x94, 0xFE, 0xEE, 0xCF, 0xA0, 0xD9, 0xEC, 0xD3, 0xAE, 0x76, 0xEA, 0xD4, 0xB0, 0x19, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xD9, 0xE4, 0x0D, 0xEE, 0xCB, + 0x9C, 0x62, 0xEB, 0xC9, 0x92, 0xD3, 0xEA, 0xC5, 0x8E, 0xFF, 0xE8, 0xC0, 0x88, 0xFF, 0xE4, 0xBA, + 0x7A, 0xFF, 0xE3, 0xB6, 0x72, 0xFF, 0xE4, 0xB6, 0x70, 0xFF, 0xE5, 0xB6, 0x70, 0xFF, 0xE4, 0xB7, + 0x70, 0xFF, 0xE5, 0xB8, 0x70, 0xFF, 0xE5, 0xB9, 0x71, 0xFF, 0xE6, 0xB9, 0x71, 0xFF, 0xE6, 0xB8, + 0x70, 0xFF, 0xE7, 0xBA, 0x74, 0xFF, 0xEA, 0xC4, 0x86, 0xFF, 0xF0, 0xD3, 0xA2, 0xFF, 0xF0, 0xD4, + 0xA8, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, + 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, + 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, + 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, + 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, + 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, + 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, + 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, + 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA8, 0xFF, 0xEF, 0xD5, 0xA8, 0xFF, 0xEE, 0xD4, + 0xA7, 0xFF, 0xEE, 0xD3, 0xA9, 0xFF, 0xED, 0xD2, 0xA9, 0xFF, 0xED, 0xD3, 0xA9, 0xFF, 0xEC, 0xD4, + 0xAC, 0xFF, 0xEB, 0xD3, 0xAB, 0xFF, 0xEC, 0xD3, 0xA9, 0xFF, 0xED, 0xD2, 0xA9, 0xFF, 0xED, 0xD3, + 0xA7, 0xFF, 0xEE, 0xD4, 0xA8, 0xFF, 0xEE, 0xD3, 0xA8, 0xFF, 0xED, 0xD3, 0xA8, 0xFF, 0xEA, 0xD2, + 0xA9, 0xFF, 0xE8, 0xD2, 0xAB, 0xFF, 0xEA, 0xD9, 0xB9, 0xFF, 0xF4, 0xEB, 0xDB, 0xFF, 0xFB, 0xF9, + 0xF4, 0xFF, 0xFB, 0xFA, 0xF8, 0xFF, 0xF6, 0xF6, 0xF2, 0xFF, 0xF5, 0xF5, 0xF1, 0xFF, 0xF7, 0xF9, + 0xF5, 0xFF, 0xF9, 0xFB, 0xFC, 0xFF, 0xF9, 0xF8, 0xF9, 0xFF, 0xF3, 0xEC, 0xE0, 0xFF, 0xE5, 0xD6, + 0xBA, 0xFF, 0xE5, 0xD0, 0xAC, 0xFF, 0xE7, 0xD1, 0xAB, 0xFF, 0xE8, 0xC8, 0x94, 0xFF, 0xE3, 0xBB, + 0x78, 0xFF, 0xE6, 0xBA, 0x72, 0xFF, 0xE6, 0xBA, 0x71, 0xFF, 0xE7, 0xBA, 0x70, 0xFF, 0xE7, 0xBA, + 0x71, 0xFF, 0xE7, 0xBA, 0x70, 0xFF, 0xE6, 0xBA, 0x71, 0xFF, 0xE7, 0xBA, 0x72, 0xFF, 0xE7, 0xBB, + 0x73, 0xFF, 0xE8, 0xBE, 0x7A, 0xFF, 0xEA, 0xC4, 0x87, 0xFF, 0xEC, 0xC9, 0x92, 0xFF, 0xEE, 0xCF, + 0x9C, 0xEE, 0xEF, 0xD4, 0xA8, 0x9C, 0xEB, 0xD6, 0xBA, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0xCD, + 0xA8, 0x25, 0xEE, 0xCC, 0x99, 0x89, 0xEB, 0xC8, 0x93, 0xE6, 0xEA, 0xC5, 0x8F, 0xFF, 0xE8, 0xC0, + 0x85, 0xFF, 0xE6, 0xBA, 0x7A, 0xFF, 0xE5, 0xB8, 0x73, 0xFF, 0xE6, 0xB8, 0x72, 0xFF, 0xE6, 0xB8, + 0x71, 0xFF, 0xE6, 0xB9, 0x71, 0xFF, 0xE6, 0xBA, 0x72, 0xFF, 0xE7, 0xBA, 0x72, 0xFF, 0xE6, 0xBA, + 0x72, 0xFF, 0xE8, 0xBB, 0x74, 0xFF, 0xEB, 0xC2, 0x81, 0xFF, 0xEE, 0xCF, 0x9E, 0xFF, 0xF0, 0xD5, + 0xA9, 0xFF, 0xF1, 0xD6, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD6, 0xAB, 0xFF, 0xF1, 0xD6, + 0xAB, 0xFF, 0xF1, 0xD6, 0xAB, 0xFF, 0xF1, 0xD6, 0xAB, 0xFF, 0xF1, 0xD6, 0xAB, 0xFF, 0xF0, 0xD7, + 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, + 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, + 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, + 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, + 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, + 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD6, 0xAB, 0xFF, 0xF1, 0xD7, + 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD6, 0xAA, 0xFF, 0xF0, 0xD6, + 0xAA, 0xFF, 0xF0, 0xD5, 0xAA, 0xFF, 0xEF, 0xD5, 0xAA, 0xFF, 0xEF, 0xD4, 0xAB, 0xFF, 0xED, 0xD4, + 0xAB, 0xFF, 0xEE, 0xD5, 0xAB, 0xFF, 0xEE, 0xD5, 0xAB, 0xFF, 0xF0, 0xD6, 0xAB, 0xFF, 0xF0, 0xD6, + 0xAA, 0xFF, 0xF1, 0xD6, 0xAA, 0xFF, 0xF0, 0xD6, 0xAA, 0xFF, 0xEF, 0xD5, 0xAB, 0xFF, 0xEE, 0xD5, + 0xAB, 0xFF, 0xEB, 0xD4, 0xAA, 0xFF, 0xE7, 0xD2, 0xAC, 0xFF, 0xEA, 0xD8, 0xB7, 0xFF, 0xF3, 0xEB, + 0xD7, 0xFF, 0xFB, 0xFA, 0xF3, 0xFF, 0xF9, 0xFA, 0xF9, 0xFF, 0xFA, 0xFA, 0xF9, 0xFF, 0xFA, 0xFB, + 0xFA, 0xFF, 0xFC, 0xFC, 0xFB, 0xFF, 0xF6, 0xF1, 0xE5, 0xFF, 0xE9, 0xDA, 0xBB, 0xFF, 0xE3, 0xD0, + 0xAC, 0xFF, 0xE7, 0xD2, 0xAB, 0xFF, 0xE8, 0xD1, 0xA8, 0xFF, 0xEB, 0xC7, 0x8B, 0xFF, 0xE7, 0xBD, + 0x76, 0xFF, 0xE7, 0xBC, 0x74, 0xFF, 0xE8, 0xBC, 0x73, 0xFF, 0xE8, 0xBC, 0x72, 0xFF, 0xE8, 0xBB, + 0x72, 0xFF, 0xE8, 0xBB, 0x72, 0xFF, 0xE7, 0xBB, 0x73, 0xFF, 0xE9, 0xBC, 0x75, 0xFF, 0xE9, 0xBE, + 0x78, 0xFF, 0xE9, 0xC3, 0x82, 0xFF, 0xEC, 0xCA, 0x90, 0xFF, 0xED, 0xCE, 0x9C, 0xF8, 0xEF, 0xD2, + 0xA5, 0xBB, 0xEF, 0xD6, 0xAE, 0x54, 0xEC, 0xD7, 0xBB, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0xD2, + 0xB6, 0x06, 0xF1, 0xD4, 0xAA, 0x3C, 0xEE, 0xCD, 0x9A, 0xA6, 0xEC, 0xC9, 0x93, 0xF2, 0xEC, 0xC6, + 0x8F, 0xFF, 0xEA, 0xC2, 0x87, 0xFF, 0xE7, 0xBC, 0x7B, 0xFF, 0xE6, 0xBA, 0x75, 0xFF, 0xE7, 0xBA, + 0x74, 0xFF, 0xE7, 0xBA, 0x74, 0xFF, 0xE7, 0xBB, 0x74, 0xFF, 0xE8, 0xBC, 0x74, 0xFF, 0xE8, 0xBC, + 0x73, 0xFF, 0xE8, 0xBC, 0x74, 0xFF, 0xEC, 0xC1, 0x7D, 0xFF, 0xED, 0xCB, 0x96, 0xFF, 0xF0, 0xD5, + 0xAA, 0xFF, 0xF2, 0xD7, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAE, 0xFF, 0xF1, 0xD7, + 0xAD, 0xFF, 0xF1, 0xD7, 0xAD, 0xFF, 0xF1, 0xD7, 0xAD, 0xFF, 0xF1, 0xD7, 0xAD, 0xFF, 0xF1, 0xD8, + 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, + 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, + 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, + 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, + 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, + 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD7, + 0xAD, 0xFF, 0xF1, 0xD7, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, + 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF0, 0xD7, 0xAD, 0xFF, 0xF1, 0xD7, 0xAD, 0xFF, 0xF0, 0xD6, + 0xAD, 0xFF, 0xF0, 0xD7, 0xAD, 0xFF, 0xF0, 0xD7, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, + 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF0, 0xD7, + 0xAC, 0xFF, 0xEF, 0xD6, 0xAC, 0xFF, 0xEC, 0xD5, 0xAC, 0xFF, 0xEA, 0xD4, 0xAD, 0xFF, 0xE9, 0xD7, + 0xB6, 0xFF, 0xF2, 0xE9, 0xD3, 0xFF, 0xF8, 0xF7, 0xF2, 0xFF, 0xFB, 0xFA, 0xF8, 0xFF, 0xFB, 0xF9, + 0xF7, 0xFF, 0xF7, 0xF3, 0xE9, 0xFF, 0xEA, 0xDD, 0xC2, 0xFF, 0xE8, 0xD4, 0xAF, 0xFF, 0xE8, 0xD3, + 0xAC, 0xFF, 0xEC, 0xD5, 0xAE, 0xFF, 0xEA, 0xD2, 0xA3, 0xFF, 0xEE, 0xC6, 0x82, 0xFF, 0xE8, 0xBE, + 0x76, 0xFF, 0xE9, 0xBD, 0x75, 0xFF, 0xE9, 0xBD, 0x75, 0xFF, 0xE9, 0xBD, 0x74, 0xFF, 0xE8, 0xBD, + 0x74, 0xFF, 0xE8, 0xBD, 0x75, 0xFF, 0xE9, 0xBD, 0x76, 0xFF, 0xEB, 0xBF, 0x79, 0xFF, 0xE9, 0xC3, + 0x82, 0xFF, 0xEC, 0xCA, 0x8E, 0xFF, 0xEE, 0xD0, 0x9A, 0xFF, 0xEF, 0xD4, 0xA5, 0xD4, 0xEE, 0xD5, + 0xAE, 0x6F, 0xEE, 0xD7, 0xB4, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xEE, 0xD4, 0xAD, 0x12, 0xEF, 0xD1, 0xA7, 0x56, 0xEF, 0xCD, 0x9B, 0xC0, 0xEE, 0xCA, + 0x94, 0xF9, 0xED, 0xC7, 0x8E, 0xFF, 0xEB, 0xC2, 0x85, 0xFF, 0xE9, 0xBD, 0x7C, 0xFF, 0xE7, 0xBB, + 0x77, 0xFF, 0xE8, 0xBC, 0x76, 0xFF, 0xE8, 0xBC, 0x75, 0xFF, 0xE9, 0xBC, 0x75, 0xFF, 0xE9, 0xBD, + 0x75, 0xFF, 0xE9, 0xBD, 0x75, 0xFF, 0xEA, 0xBF, 0x7A, 0xFF, 0xEE, 0xC9, 0x8C, 0xFF, 0xF1, 0xD4, + 0xA8, 0xFF, 0xF3, 0xD8, 0xAF, 0xFF, 0xF2, 0xD9, 0xB0, 0xFF, 0xF2, 0xD9, 0xB0, 0xFF, 0xF2, 0xD9, + 0xAF, 0xFF, 0xF2, 0xD8, 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xD9, + 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xDA, 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xDA, + 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xDA, 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xDA, + 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xDA, 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xDA, + 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xDA, 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xDA, + 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xDA, 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xDA, + 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xDA, 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xD9, + 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xD9, + 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF1, 0xD9, 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xD9, + 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xDA, 0xAF, 0xFF, 0xF2, 0xDA, 0xB0, 0xFF, 0xF2, 0xDA, + 0xB0, 0xFF, 0xF2, 0xDA, 0xB0, 0xFF, 0xF2, 0xDA, 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xD9, + 0xAF, 0xFF, 0xF1, 0xD8, 0xAF, 0xFF, 0xF0, 0xD8, 0xAF, 0xFF, 0xEF, 0xD8, 0xAF, 0xFF, 0xEC, 0xD6, + 0xAF, 0xFF, 0xEC, 0xD8, 0xB5, 0xFF, 0xF1, 0xE6, 0xD1, 0xFF, 0xF8, 0xF1, 0xE6, 0xFF, 0xF8, 0xF2, + 0xE4, 0xFF, 0xEF, 0xE2, 0xC9, 0xFF, 0xE9, 0xD7, 0xB3, 0xFF, 0xEA, 0xD6, 0xAF, 0xFF, 0xEC, 0xD6, + 0xAD, 0xFF, 0xF1, 0xD9, 0xAF, 0xFF, 0xEC, 0xCF, 0x9A, 0xFF, 0xEE, 0xC2, 0x7C, 0xFF, 0xE9, 0xBF, + 0x77, 0xFF, 0xEA, 0xBE, 0x76, 0xFF, 0xEA, 0xBF, 0x76, 0xFF, 0xEA, 0xBE, 0x76, 0xFF, 0xE9, 0xBE, + 0x76, 0xFF, 0xEA, 0xBF, 0x78, 0xFF, 0xEB, 0xC0, 0x7A, 0xFF, 0xEB, 0xC3, 0x82, 0xFF, 0xEC, 0xC9, + 0x90, 0xFF, 0xEF, 0xCE, 0x9A, 0xFE, 0xEF, 0xD3, 0xA1, 0xE2, 0xF1, 0xD7, 0xA9, 0x89, 0xEC, 0xD6, + 0xB7, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC, 0xD4, 0xAC, 0x1B, 0xED, 0xD1, 0xA7, 0x6E, 0xEE, 0xCD, + 0x9B, 0xD1, 0xEE, 0xCA, 0x93, 0xFF, 0xED, 0xC8, 0x8E, 0xFF, 0xEC, 0xC4, 0x87, 0xFF, 0xE9, 0xBF, + 0x7D, 0xFF, 0xE9, 0xBE, 0x79, 0xFF, 0xE9, 0xBE, 0x78, 0xFF, 0xEA, 0xBE, 0x77, 0xFF, 0xEA, 0xBE, + 0x77, 0xFF, 0xEA, 0xBF, 0x77, 0xFF, 0xEB, 0xC0, 0x79, 0xFF, 0xEE, 0xC5, 0x82, 0xFF, 0xF1, 0xD1, + 0x9E, 0xFF, 0xF3, 0xD9, 0xB0, 0xFF, 0xF4, 0xDA, 0xB2, 0xFF, 0xF3, 0xDA, 0xB2, 0xFF, 0xF3, 0xDA, + 0xB2, 0xFF, 0xF3, 0xDA, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, + 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, + 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, + 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, + 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, + 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, + 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, + 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDA, + 0xB2, 0xFF, 0xF3, 0xDA, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, + 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, + 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB1, 0xFF, 0xF3, 0xDB, + 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF2, 0xDA, 0xB2, 0xFF, 0xF1, 0xD9, 0xB1, 0xFF, 0xF1, 0xDA, + 0xB1, 0xFF, 0xEF, 0xD8, 0xB2, 0xFF, 0xEC, 0xDA, 0xB6, 0xFF, 0xF0, 0xE1, 0xC4, 0xFF, 0xF0, 0xE1, + 0xC4, 0xFF, 0xED, 0xDB, 0xB6, 0xFF, 0xEF, 0xDA, 0xB2, 0xFF, 0xF0, 0xDA, 0xB1, 0xFF, 0xF0, 0xD8, + 0xAF, 0xFF, 0xF3, 0xD9, 0xAB, 0xFF, 0xED, 0xCA, 0x8E, 0xFF, 0xEB, 0xC0, 0x7A, 0xFF, 0xEA, 0xBF, + 0x78, 0xFF, 0xEB, 0xC0, 0x78, 0xFF, 0xEB, 0xC0, 0x78, 0xFF, 0xEA, 0xC0, 0x79, 0xFF, 0xEA, 0xC0, + 0x7A, 0xFF, 0xEB, 0xC2, 0x7D, 0xFF, 0xEC, 0xC5, 0x83, 0xFF, 0xED, 0xCA, 0x91, 0xFF, 0xF1, 0xD2, + 0x9D, 0xFF, 0xF3, 0xD5, 0xA4, 0xEA, 0xF4, 0xD5, 0xA3, 0xA0, 0xF2, 0xD7, 0xA8, 0x3B, 0xE8, 0xD9, + 0xBF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xED, 0xD4, 0xAA, 0x25, 0xF0, 0xD2, + 0xA3, 0x7E, 0xF0, 0xCF, 0x9B, 0xD8, 0xEF, 0xCC, 0x95, 0xFD, 0xEE, 0xC8, 0x8E, 0xFF, 0xEC, 0xC4, + 0x85, 0xFF, 0xEB, 0xC0, 0x7E, 0xFF, 0xEA, 0xBF, 0x7A, 0xFF, 0xEB, 0xBF, 0x79, 0xFF, 0xEB, 0xBF, + 0x79, 0xFF, 0xEB, 0xC0, 0x78, 0xFF, 0xEB, 0xC0, 0x79, 0xFF, 0xEE, 0xC3, 0x7D, 0xFF, 0xF1, 0xCD, + 0x8F, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF4, 0xDC, 0xB4, 0xFF, 0xF4, 0xDC, 0xB4, 0xFF, 0xF4, 0xDC, + 0xB4, 0xFF, 0xF4, 0xDC, 0xB4, 0xFF, 0xF4, 0xDC, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, + 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, + 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, + 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, + 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, + 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, + 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, + 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDC, 0xB4, 0xFF, 0xF4, 0xDC, + 0xB4, 0xFF, 0xF4, 0xDC, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, + 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDC, + 0xB4, 0xFF, 0xF4, 0xDC, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, + 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDC, 0xB4, 0xFF, 0xF4, 0xDC, 0xB4, 0xFF, 0xF3, 0xDC, + 0xB3, 0xFF, 0xF2, 0xDA, 0xB3, 0xFF, 0xEF, 0xDA, 0xB4, 0xFF, 0xF1, 0xDC, 0xB7, 0xFF, 0xF0, 0xDC, + 0xB8, 0xFF, 0xF0, 0xDB, 0xB5, 0xFF, 0xF2, 0xDC, 0xB5, 0xFF, 0xF3, 0xDC, 0xB3, 0xFF, 0xF3, 0xDB, + 0xB1, 0xFF, 0xF3, 0xD5, 0xA1, 0xFF, 0xEC, 0xC6, 0x83, 0xFF, 0xEA, 0xC0, 0x79, 0xFF, 0xEC, 0xC2, + 0x7A, 0xFF, 0xED, 0xC1, 0x7A, 0xFF, 0xEC, 0xC2, 0x7A, 0xFF, 0xEC, 0xC2, 0x7C, 0xFF, 0xEC, 0xC3, + 0x7D, 0xFF, 0xEC, 0xC5, 0x84, 0xFF, 0xEF, 0xCB, 0x8F, 0xFF, 0xF0, 0xD0, 0x9D, 0xFF, 0xF3, 0xD4, + 0xA2, 0xEE, 0xF3, 0xD6, 0xA6, 0xB2, 0xF1, 0xD8, 0xB0, 0x4A, 0xE9, 0xDB, 0xC1, 0x0A, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xD5, + 0xA8, 0x2C, 0xF2, 0xD4, 0xA5, 0x89, 0xEF, 0xCF, 0x9C, 0xDE, 0xEE, 0xCC, 0x94, 0xFF, 0xEE, 0xCA, + 0x8F, 0xFF, 0xED, 0xC6, 0x88, 0xFF, 0xEC, 0xC2, 0x7F, 0xFF, 0xEC, 0xC1, 0x7C, 0xFF, 0xEC, 0xC1, + 0x7B, 0xFF, 0xEC, 0xC1, 0x7A, 0xFF, 0xEC, 0xC1, 0x7A, 0xFF, 0xED, 0xC2, 0x7C, 0xFF, 0xF1, 0xC8, + 0x83, 0xFF, 0xF2, 0xD3, 0xA2, 0xFF, 0xF4, 0xDC, 0xB3, 0xFF, 0xF6, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF4, 0xDE, + 0xB6, 0xFF, 0xF4, 0xDD, 0xB6, 0xFF, 0xF3, 0xDD, 0xB6, 0xFF, 0xF3, 0xDD, 0xB7, 0xFF, 0xF3, 0xDD, + 0xB7, 0xFF, 0xF3, 0xDD, 0xB7, 0xFF, 0xF3, 0xDD, 0xB6, 0xFF, 0xF4, 0xDC, 0xB4, 0xFF, 0xF3, 0xDA, + 0xAC, 0xFF, 0xF1, 0xCD, 0x90, 0xFF, 0xEC, 0xC4, 0x7E, 0xFF, 0xEC, 0xC3, 0x7B, 0xFF, 0xED, 0xC3, + 0x7B, 0xFF, 0xED, 0xC3, 0x7C, 0xFF, 0xED, 0xC4, 0x7D, 0xFF, 0xEE, 0xC5, 0x7F, 0xFF, 0xEF, 0xC8, + 0x84, 0xFF, 0xF1, 0xCC, 0x90, 0xFF, 0xF2, 0xD2, 0x9E, 0xFF, 0xF2, 0xD5, 0xA4, 0xF1, 0xF5, 0xD5, + 0xA1, 0xB9, 0xF5, 0xDA, 0xAC, 0x55, 0xD2, 0xE5, 0xF8, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xD5, + 0xA7, 0x01, 0xF2, 0xD6, 0xA8, 0x32, 0xF1, 0xD4, 0xA3, 0x94, 0xF1, 0xD1, 0x9D, 0xE0, 0xF0, 0xCE, + 0x98, 0xFE, 0xEF, 0xCB, 0x91, 0xFF, 0xEE, 0xC7, 0x88, 0xFF, 0xED, 0xC3, 0x81, 0xFF, 0xEC, 0xC2, + 0x7D, 0xFF, 0xED, 0xC2, 0x7C, 0xFF, 0xED, 0xC2, 0x7C, 0xFF, 0xEE, 0xC2, 0x7C, 0xFF, 0xEF, 0xC4, + 0x7E, 0xFF, 0xF2, 0xCD, 0x90, 0xFF, 0xF4, 0xD9, 0xAE, 0xFF, 0xF7, 0xDE, 0xB6, 0xFF, 0xF7, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xE0, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF5, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF5, 0xDF, 0xB8, 0xFF, 0xF5, 0xDF, 0xB8, 0xFF, 0xF5, 0xDF, + 0xB9, 0xFF, 0xF6, 0xDF, 0xB9, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF2, 0xD5, + 0x9F, 0xFF, 0xEF, 0xC7, 0x83, 0xFF, 0xEE, 0xC5, 0x7D, 0xFF, 0xEE, 0xC4, 0x7D, 0xFF, 0xEE, 0xC5, + 0x7D, 0xFF, 0xEE, 0xC5, 0x7F, 0xFF, 0xEE, 0xC6, 0x80, 0xFF, 0xF0, 0xC8, 0x85, 0xFF, 0xF3, 0xCD, + 0x8F, 0xFF, 0xF2, 0xD2, 0x9D, 0xFF, 0xF3, 0xD6, 0xA5, 0xF4, 0xF6, 0xD7, 0xA6, 0xC2, 0xF4, 0xD6, + 0xA6, 0x62, 0xED, 0xDC, 0xC6, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF1, 0xD4, 0xA5, 0x01, 0xF1, 0xD6, 0xA8, 0x3B, 0xF2, 0xD5, 0xA7, 0x9B, 0xF1, 0xD2, + 0x9F, 0xE5, 0xF0, 0xCF, 0x98, 0xFF, 0xF1, 0xCD, 0x92, 0xFF, 0xF1, 0xCA, 0x8B, 0xFF, 0xEE, 0xC6, + 0x83, 0xFF, 0xEE, 0xC4, 0x80, 0xFF, 0xEE, 0xC4, 0x7F, 0xFF, 0xEE, 0xC4, 0x7F, 0xFF, 0xEF, 0xC5, + 0x7F, 0xFF, 0xF1, 0xC7, 0x84, 0xFF, 0xF3, 0xD2, 0x9B, 0xFF, 0xF6, 0xDC, 0xB5, 0xFF, 0xF8, 0xE0, + 0xBA, 0xFF, 0xF7, 0xE1, 0xBB, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBB, 0xFF, 0xF6, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBB, 0xFF, 0xF5, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xB9, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF4, 0xD9, 0xA9, 0xFF, 0xF3, 0xCE, + 0x8F, 0xFF, 0xEF, 0xC7, 0x81, 0xFF, 0xEE, 0xC6, 0x7E, 0xFF, 0xEF, 0xC6, 0x7F, 0xFF, 0xEF, 0xC7, + 0x80, 0xFF, 0xF0, 0xC8, 0x83, 0xFF, 0xF1, 0xCA, 0x87, 0xFF, 0xF3, 0xCE, 0x92, 0xFF, 0xF3, 0xD4, + 0x9E, 0xFF, 0xF5, 0xD8, 0xA6, 0xF9, 0xF5, 0xD7, 0xA4, 0xC6, 0xF5, 0xD7, 0xA6, 0x6A, 0xE7, 0xE0, + 0xCB, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xD6, 0xA9, 0x04, 0xF3, 0xD7, 0xA9, 0x3E, 0xF3, 0xD6, + 0xA6, 0xA0, 0xF3, 0xD3, 0xA0, 0xE3, 0xF2, 0xD1, 0x9A, 0xFE, 0xF2, 0xCE, 0x94, 0xFF, 0xF1, 0xCB, + 0x8C, 0xFF, 0xEF, 0xC7, 0x86, 0xFF, 0xEE, 0xC5, 0x82, 0xFF, 0xEF, 0xC6, 0x80, 0xFF, 0xF0, 0xC6, + 0x80, 0xFF, 0xF1, 0xC7, 0x82, 0xFF, 0xF3, 0xCB, 0x88, 0xFF, 0xF3, 0xD7, 0xA6, 0xFF, 0xF7, 0xE0, + 0xBA, 0xFF, 0xF8, 0xE1, 0xBC, 0xFF, 0xF7, 0xE1, 0xBC, 0xFF, 0xF7, 0xE1, 0xBC, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE1, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBD, 0xFF, 0xF7, 0xE2, 0xBD, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE2, 0xBA, 0xFF, 0xF6, 0xDD, 0xB1, 0xFF, 0xF4, 0xD2, 0x98, 0xFF, 0xF2, 0xCB, + 0x85, 0xFF, 0xEF, 0xC8, 0x81, 0xFF, 0xEF, 0xC8, 0x80, 0xFF, 0xF0, 0xC8, 0x83, 0xFF, 0xF0, 0xC9, + 0x85, 0xFF, 0xF2, 0xCB, 0x8A, 0xFF, 0xF3, 0xD0, 0x95, 0xFF, 0xF2, 0xD3, 0x9F, 0xFF, 0xF4, 0xD8, + 0xA6, 0xF7, 0xF6, 0xD9, 0xA7, 0xCD, 0xF3, 0xD7, 0xAC, 0x6D, 0xEE, 0xDE, 0xC7, 0x1E, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xD6, 0xA7, 0x02, 0xF3, 0xD7, + 0xA9, 0x3D, 0xF4, 0xD7, 0xA8, 0x99, 0xF2, 0xD4, 0xA1, 0xE2, 0xF2, 0xD1, 0x9A, 0xFE, 0xF2, 0xD0, + 0x96, 0xFF, 0xF3, 0xCE, 0x91, 0xFF, 0xF0, 0xCA, 0x89, 0xFF, 0xEF, 0xC8, 0x84, 0xFF, 0xF0, 0xC7, + 0x82, 0xFF, 0xF0, 0xC7, 0x83, 0xFF, 0xF1, 0xC9, 0x85, 0xFF, 0xF3, 0xCF, 0x90, 0xFF, 0xF5, 0xDB, + 0xAE, 0xFF, 0xF9, 0xE2, 0xBB, 0xFF, 0xF8, 0xE2, 0xBE, 0xFF, 0xF8, 0xE3, 0xBE, 0xFF, 0xF7, 0xE3, + 0xBE, 0xFF, 0xF7, 0xE3, 0xBE, 0xFF, 0xF7, 0xE3, 0xBE, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, + 0xBD, 0xFF, 0xF7, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBE, 0xFF, 0xF7, 0xE3, + 0xBD, 0xFF, 0xF7, 0xE3, 0xBE, 0xFF, 0xF7, 0xE3, 0xBE, 0xFF, 0xF8, 0xE3, 0xBE, 0xFF, 0xF8, 0xE2, + 0xBC, 0xFF, 0xF7, 0xDF, 0xB4, 0xFF, 0xF5, 0xD5, 0xA0, 0xFF, 0xF2, 0xCC, 0x8A, 0xFF, 0xF1, 0xCA, + 0x83, 0xFF, 0xF1, 0xC9, 0x83, 0xFF, 0xF0, 0xCA, 0x84, 0xFF, 0xF2, 0xCC, 0x88, 0xFF, 0xF4, 0xCE, + 0x8F, 0xFF, 0xF4, 0xD1, 0x99, 0xFF, 0xF5, 0xD6, 0xA2, 0xFF, 0xF6, 0xD8, 0xA5, 0xF5, 0xF8, 0xD9, + 0xA3, 0xC2, 0xF6, 0xD9, 0xA7, 0x6A, 0xEA, 0xDD, 0xCE, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF3, 0xD8, + 0xAA, 0x02, 0xF4, 0xD9, 0xAB, 0x36, 0xF3, 0xD8, 0xA8, 0x8F, 0xF3, 0xD5, 0xA2, 0xDA, 0xF3, 0xD4, + 0x9D, 0xFB, 0xF4, 0xD2, 0x99, 0xFF, 0xF3, 0xD0, 0x94, 0xFF, 0xF1, 0xCB, 0x8C, 0xFF, 0xF0, 0xC9, + 0x86, 0xFF, 0xF1, 0xC8, 0x84, 0xFF, 0xF0, 0xC9, 0x83, 0xFF, 0xF4, 0xCB, 0x87, 0xFF, 0xF6, 0xD3, + 0x96, 0xFF, 0xF7, 0xDE, 0xB2, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF9, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, + 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, + 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, + 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, + 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, + 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, + 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, + 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, + 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, + 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, + 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, + 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, + 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE3, 0xBE, 0xFF, 0xF8, 0xE1, + 0xB8, 0xFF, 0xF6, 0xD8, 0xA6, 0xFF, 0xF4, 0xCF, 0x8E, 0xFF, 0xF1, 0xCB, 0x85, 0xFF, 0xF2, 0xCB, + 0x84, 0xFF, 0xF1, 0xCB, 0x86, 0xFF, 0xF3, 0xCE, 0x8A, 0xFF, 0xF4, 0xD0, 0x91, 0xFF, 0xF6, 0xD3, + 0x9A, 0xFF, 0xF4, 0xD5, 0xA2, 0xFE, 0xF5, 0xD7, 0xA8, 0xED, 0xF7, 0xDB, 0xA9, 0xBB, 0xF6, 0xDB, + 0xAD, 0x60, 0xED, 0xDE, 0xC8, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF3, 0xDB, 0xAF, 0x2F, 0xF4, 0xD9, 0xAD, 0x7E, 0xF4, 0xD6, + 0xA4, 0xCF, 0xF4, 0xD5, 0x9F, 0xF9, 0xF4, 0xD4, 0x9D, 0xFF, 0xF4, 0xD1, 0x99, 0xFF, 0xF2, 0xCD, + 0x8F, 0xFF, 0xF2, 0xCB, 0x89, 0xFF, 0xF2, 0xCA, 0x87, 0xFF, 0xF2, 0xCA, 0x87, 0xFF, 0xF4, 0xCD, + 0x8A, 0xFF, 0xF6, 0xD3, 0x98, 0xFF, 0xF5, 0xDE, 0xB2, 0xFF, 0xF9, 0xE4, 0xBE, 0xFF, 0xF9, 0xE5, + 0xC1, 0xFF, 0xF9, 0xE5, 0xC1, 0xFF, 0xF8, 0xE5, 0xC1, 0xFF, 0xF8, 0xE5, 0xC0, 0xFF, 0xF8, 0xE5, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF8, 0xE4, + 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, + 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, + 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, + 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, + 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, + 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, + 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE5, + 0xC0, 0xFF, 0xF8, 0xE5, 0xC0, 0xFF, 0xF8, 0xE5, 0xC0, 0xFF, 0xF8, 0xE5, 0xC0, 0xFF, 0xF8, 0xE4, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC1, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE5, 0xC0, 0xFF, 0xF8, 0xE5, + 0xC0, 0xFF, 0xF8, 0xE5, 0xC0, 0xFF, 0xF9, 0xE4, 0xBF, 0xFF, 0xF8, 0xE1, 0xB9, 0xFF, 0xF7, 0xD9, + 0xA7, 0xFF, 0xF4, 0xD0, 0x92, 0xFF, 0xF3, 0xCC, 0x88, 0xFF, 0xF3, 0xCB, 0x87, 0xFF, 0xF2, 0xCC, + 0x89, 0xFF, 0xF4, 0xCF, 0x8F, 0xFF, 0xF5, 0xD2, 0x97, 0xFF, 0xF6, 0xD5, 0x9F, 0xFF, 0xF5, 0xD7, + 0xA4, 0xFE, 0xF5, 0xD9, 0xA9, 0xE6, 0xF4, 0xD8, 0xA8, 0xA6, 0xF8, 0xDD, 0xB1, 0x54, 0xE7, 0xEA, + 0xEA, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0xDC, 0xB1, 0x24, 0xF3, 0xD9, + 0xAC, 0x68, 0xF4, 0xD7, 0xA5, 0xC2, 0xF5, 0xD6, 0xA2, 0xF4, 0xF6, 0xD5, 0x9F, 0xFF, 0xF6, 0xD3, + 0x9B, 0xFF, 0xF4, 0xD0, 0x94, 0xFF, 0xF4, 0xCD, 0x8E, 0xFF, 0xF3, 0xCC, 0x8A, 0xFF, 0xF2, 0xCC, + 0x89, 0xFF, 0xF5, 0xCD, 0x8C, 0xFF, 0xF7, 0xD4, 0x99, 0xFF, 0xF8, 0xDE, 0xB3, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xFA, 0xE6, 0xC2, 0xFF, 0xF9, 0xE6, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, + 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, + 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, + 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, + 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, + 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, + 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, + 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, + 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, + 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, + 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, + 0xC2, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE2, 0xBA, 0xFF, 0xF8, 0xDB, 0xA8, 0xFF, 0xF5, 0xD1, + 0x92, 0xFF, 0xF3, 0xCE, 0x8B, 0xFF, 0xF4, 0xCD, 0x89, 0xFF, 0xF4, 0xCE, 0x8D, 0xFF, 0xF5, 0xD1, + 0x94, 0xFF, 0xF6, 0xD4, 0x9B, 0xFF, 0xF6, 0xD7, 0xA0, 0xFF, 0xF6, 0xD9, 0xA6, 0xFB, 0xF7, 0xDB, + 0xAA, 0xD8, 0xF8, 0xDC, 0xAD, 0x94, 0xF4, 0xDA, 0xB0, 0x3F, 0xF5, 0xDF, 0xC3, 0x0E, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xDC, + 0xB3, 0x1A, 0xF4, 0xDB, 0xB1, 0x50, 0xF4, 0xD8, 0xA7, 0xA0, 0xF6, 0xD7, 0xA2, 0xE4, 0xF7, 0xD7, + 0xA1, 0xFE, 0xF6, 0xD6, 0x9E, 0xFF, 0xF4, 0xD2, 0x99, 0xFF, 0xF4, 0xD0, 0x94, 0xFF, 0xF4, 0xCE, + 0x8E, 0xFF, 0xF3, 0xCD, 0x8C, 0xFF, 0xF4, 0xCE, 0x8E, 0xFF, 0xF5, 0xD3, 0x98, 0xFF, 0xF6, 0xDD, + 0xB1, 0xFF, 0xFA, 0xE6, 0xC0, 0xFF, 0xFB, 0xE6, 0xC4, 0xFF, 0xFB, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, + 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE7, 0xC4, 0xFF, 0xFA, 0xE6, + 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, + 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, + 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, + 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, + 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, + 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, + 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, + 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, + 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xF9, 0xE6, 0xC4, 0xFF, 0xF9, 0xE6, 0xC4, 0xFF, 0xF9, 0xE6, + 0xC3, 0xFF, 0xF9, 0xE1, 0xB9, 0xFF, 0xF8, 0xD9, 0xA4, 0xFF, 0xF5, 0xD1, 0x92, 0xFF, 0xF3, 0xCF, + 0x8B, 0xFF, 0xF4, 0xCF, 0x8D, 0xFF, 0xF5, 0xD1, 0x92, 0xFF, 0xF6, 0xD4, 0x9A, 0xFF, 0xF6, 0xD7, + 0x9F, 0xFF, 0xF6, 0xD8, 0xA3, 0xFF, 0xF7, 0xDA, 0xA6, 0xF3, 0xF8, 0xDC, 0xAB, 0xC3, 0xF8, 0xDE, + 0xB0, 0x7C, 0xF9, 0xE0, 0xB6, 0x2D, 0xF3, 0xDF, 0xBD, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF1, 0xDB, 0xB9, 0x0E, 0xF2, 0xD9, 0xB0, 0x3C, 0xF5, 0xD8, 0xA8, 0x7E, 0xF7, 0xDA, + 0xA5, 0xCB, 0xF8, 0xD9, 0xA3, 0xF6, 0xF7, 0xD7, 0xA0, 0xFF, 0xF6, 0xD5, 0x9D, 0xFF, 0xF6, 0xD3, + 0x98, 0xFF, 0xF5, 0xD1, 0x92, 0xFF, 0xF4, 0xD0, 0x90, 0xFF, 0xF6, 0xD0, 0x90, 0xFF, 0xF7, 0xD3, + 0x98, 0xFF, 0xF9, 0xDB, 0xAC, 0xFF, 0xF9, 0xE3, 0xBD, 0xFF, 0xFB, 0xE6, 0xC5, 0xFF, 0xFB, 0xE7, + 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, + 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, + 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, + 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, + 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, + 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, + 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, + 0xC6, 0xFF, 0xFB, 0xE8, 0xC6, 0xFF, 0xFB, 0xE8, 0xC6, 0xFF, 0xFB, 0xE8, 0xC6, 0xFF, 0xFB, 0xE8, + 0xC6, 0xFF, 0xFB, 0xE8, 0xC6, 0xFF, 0xFB, 0xE8, 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE7, + 0xC5, 0xFF, 0xFB, 0xE6, 0xC5, 0xFF, 0xFA, 0xE6, 0xC6, 0xFF, 0xFB, 0xE6, 0xC2, 0xFF, 0xFA, 0xE0, + 0xB5, 0xFF, 0xF8, 0xD9, 0xA1, 0xFF, 0xF5, 0xD3, 0x93, 0xFF, 0xF3, 0xD1, 0x90, 0xFF, 0xF5, 0xD1, + 0x90, 0xFF, 0xF5, 0xD3, 0x96, 0xFF, 0xF7, 0xD7, 0x9E, 0xFF, 0xF8, 0xD9, 0xA2, 0xFF, 0xF8, 0xDA, + 0xA4, 0xFC, 0xF7, 0xDC, 0xAB, 0xE5, 0xF6, 0xDC, 0xB0, 0xA4, 0xF6, 0xDD, 0xB2, 0x5C, 0xF7, 0xE0, + 0xB5, 0x1C, 0xF8, 0xE0, 0xB7, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0xD9, 0xC7, 0x04, 0xE8, 0xD7, 0xC3, 0x21, 0xF6, 0xDB, + 0xAA, 0x5B, 0xF7, 0xDA, 0xA6, 0xA1, 0xF7, 0xD8, 0xA5, 0xDE, 0xF6, 0xD7, 0xA3, 0xFA, 0xF7, 0xD7, + 0xA1, 0xFF, 0xF8, 0xD7, 0x9E, 0xFF, 0xF7, 0xD5, 0x99, 0xFF, 0xF6, 0xD3, 0x95, 0xFF, 0xF5, 0xD2, + 0x93, 0xFF, 0xF6, 0xD3, 0x96, 0xFF, 0xF7, 0xD9, 0xA4, 0xFF, 0xF9, 0xE1, 0xB7, 0xFF, 0xFB, 0xE6, + 0xC4, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFB, 0xE8, 0xC8, 0xFF, 0xFB, 0xE8, 0xC8, 0xFF, 0xFB, 0xE8, + 0xC8, 0xFF, 0xFB, 0xE8, 0xC8, 0xFF, 0xFB, 0xE8, 0xC8, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xE9, + 0xC7, 0xFF, 0xFC, 0xE9, 0xC7, 0xFF, 0xFC, 0xE9, 0xC7, 0xFF, 0xFC, 0xE9, 0xC7, 0xFF, 0xFC, 0xE9, + 0xC7, 0xFF, 0xFC, 0xE9, 0xC7, 0xFF, 0xFB, 0xE9, 0xC7, 0xFF, 0xFC, 0xE9, 0xC7, 0xFF, 0xFB, 0xE8, + 0xC7, 0xFF, 0xFC, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFC, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, + 0xC7, 0xFF, 0xFC, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFC, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, + 0xC7, 0xFF, 0xFC, 0xE8, 0xC7, 0xFF, 0xFB, 0xE9, 0xC7, 0xFF, 0xFC, 0xE9, 0xC7, 0xFF, 0xFB, 0xE8, + 0xC7, 0xFF, 0xFC, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFB, 0xE8, + 0xC8, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFB, 0xE9, 0xC8, 0xFF, 0xFB, 0xE8, 0xC8, 0xFF, 0xFB, 0xE7, + 0xC7, 0xFF, 0xFC, 0xE7, 0xC6, 0xFF, 0xFA, 0xE5, 0xBE, 0xFF, 0xF9, 0xDE, 0xAD, 0xFF, 0xF8, 0xD8, + 0x9C, 0xFF, 0xF7, 0xD5, 0x96, 0xFF, 0xF5, 0xD4, 0x94, 0xFF, 0xF6, 0xD5, 0x99, 0xFF, 0xF6, 0xD7, + 0x9E, 0xFF, 0xF6, 0xD8, 0xA4, 0xFF, 0xF8, 0xDA, 0xA6, 0xFD, 0xF9, 0xDB, 0xA8, 0xEF, 0xF7, 0xDB, + 0xAA, 0xC5, 0xF8, 0xDE, 0xB3, 0x80, 0xF7, 0xE4, 0xC4, 0x3F, 0xF6, 0xE4, 0xC5, 0x0F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0xD8, 0xC8, 0x01, 0xF1, 0xD8, + 0xB2, 0x10, 0xF5, 0xD9, 0xAC, 0x34, 0xF5, 0xDA, 0xAA, 0x72, 0xF6, 0xDA, 0xA9, 0xC0, 0xF7, 0xDB, + 0xA7, 0xF0, 0xF8, 0xDA, 0xA4, 0xFF, 0xF9, 0xD9, 0xA2, 0xFF, 0xF9, 0xD8, 0x9F, 0xFF, 0xF8, 0xD6, + 0x9A, 0xFF, 0xF7, 0xD4, 0x97, 0xFF, 0xF6, 0xD3, 0x98, 0xFF, 0xF8, 0xD6, 0x9E, 0xFF, 0xFB, 0xDD, + 0xB0, 0xFF, 0xFD, 0xE5, 0xC0, 0xFF, 0xFC, 0xE8, 0xC8, 0xFF, 0xFC, 0xE8, 0xC9, 0xFF, 0xFB, 0xE8, + 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xEA, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xEA, + 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, + 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, + 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, + 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, + 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, + 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFB, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, + 0xC9, 0xFF, 0xFD, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xCA, 0xFF, 0xFC, 0xE8, 0xC8, 0xFF, 0xFC, 0xE6, + 0xC3, 0xFF, 0xFC, 0xE2, 0xB7, 0xFF, 0xFA, 0xDC, 0xA5, 0xFF, 0xF7, 0xD7, 0x9C, 0xFF, 0xF6, 0xD6, + 0x97, 0xFF, 0xF7, 0xD6, 0x99, 0xFF, 0xF8, 0xD8, 0x9E, 0xFF, 0xFA, 0xDA, 0xA2, 0xFF, 0xF9, 0xDC, + 0xA6, 0xFF, 0xF9, 0xDC, 0xA9, 0xFB, 0xF9, 0xDC, 0xAA, 0xD7, 0xFA, 0xDD, 0xAE, 0x97, 0xF8, 0xDE, + 0xB0, 0x4F, 0xF8, 0xE0, 0xB5, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xDC, 0xB7, 0x18, 0xF3, 0xDC, 0xB4, 0x46, 0xF6, 0xDC, + 0xAC, 0x8C, 0xF7, 0xDC, 0xA9, 0xC8, 0xF7, 0xDB, 0xA7, 0xF1, 0xF9, 0xDA, 0xA5, 0xFE, 0xF9, 0xDA, + 0xA3, 0xFF, 0xF8, 0xD8, 0xA0, 0xFF, 0xF7, 0xD7, 0x9E, 0xFF, 0xF7, 0xD6, 0x9C, 0xFF, 0xF7, 0xD6, + 0x9D, 0xFF, 0xF8, 0xD9, 0xA4, 0xFF, 0xF9, 0xE0, 0xB3, 0xFF, 0xFB, 0xE6, 0xC3, 0xFF, 0xFB, 0xE9, + 0xC8, 0xFF, 0xFB, 0xEA, 0xC9, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFB, 0xE9, + 0xCB, 0xFF, 0xFC, 0xE9, 0xCB, 0xFF, 0xFB, 0xE9, 0xCB, 0xFF, 0xFB, 0xE9, 0xCB, 0xFF, 0xFB, 0xEA, + 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, + 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, + 0xCA, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, + 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFB, 0xE9, 0xCB, 0xFF, 0xFC, 0xE9, 0xCB, 0xFF, 0xFB, 0xE9, + 0xCB, 0xFF, 0xFB, 0xE9, 0xCB, 0xFF, 0xFB, 0xEA, 0xCA, 0xFF, 0xFB, 0xE9, 0xCA, 0xFF, 0xFB, 0xE9, + 0xCA, 0xFF, 0xFD, 0xE9, 0xC9, 0xFF, 0xFC, 0xE8, 0xC5, 0xFF, 0xFB, 0xE4, 0xBA, 0xFF, 0xFA, 0xDD, + 0xAB, 0xFF, 0xF9, 0xD9, 0xA0, 0xFF, 0xF7, 0xD7, 0x9D, 0xFF, 0xF7, 0xD8, 0x9E, 0xFF, 0xF6, 0xD8, + 0xA0, 0xFF, 0xF7, 0xD9, 0xA6, 0xFF, 0xF9, 0xDB, 0xA7, 0xFE, 0xFA, 0xDC, 0xA9, 0xF9, 0xF9, 0xDD, + 0xA9, 0xE2, 0xF9, 0xDD, 0xAC, 0xAD, 0xFA, 0xE0, 0xB4, 0x69, 0xFA, 0xE0, 0xB7, 0x2B, 0xF8, 0xE0, + 0xB5, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xDC, 0xB7, 0x08, 0xF4, 0xDB, + 0xAF, 0x23, 0xF7, 0xDC, 0xAD, 0x4F, 0xF8, 0xDD, 0xAC, 0x8D, 0xF8, 0xDD, 0xAB, 0xCC, 0xF9, 0xDC, + 0xA9, 0xF2, 0xF9, 0xDB, 0xA6, 0xFD, 0xF9, 0xDA, 0xA4, 0xFF, 0xF9, 0xD9, 0xA3, 0xFF, 0xF8, 0xD9, + 0xA1, 0xFF, 0xF9, 0xD8, 0x9F, 0xFF, 0xF9, 0xD8, 0xA1, 0xFF, 0xF9, 0xDB, 0xA7, 0xFF, 0xFB, 0xE0, + 0xB5, 0xFF, 0xFC, 0xE5, 0xBF, 0xFF, 0xFB, 0xE9, 0xC7, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, + 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFB, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFB, 0xEA, + 0xCC, 0xFF, 0xFC, 0xEA, 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, + 0xCD, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, + 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, + 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, + 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFB, 0xEA, 0xCB, 0xFF, 0xFC, 0xE9, 0xCA, 0xFF, 0xFD, 0xE7, + 0xC3, 0xFF, 0xFC, 0xE2, 0xB8, 0xFF, 0xFB, 0xDF, 0xAE, 0xFF, 0xFB, 0xDB, 0xA6, 0xFF, 0xF8, 0xD9, + 0xA1, 0xFF, 0xF6, 0xD8, 0xA0, 0xFF, 0xF6, 0xD8, 0xA2, 0xFF, 0xF9, 0xDA, 0xA2, 0xFF, 0xFA, 0xDB, + 0xA6, 0xFF, 0xFA, 0xDD, 0xAA, 0xFC, 0xF9, 0xDC, 0xA9, 0xE0, 0xFB, 0xDD, 0xB0, 0xAF, 0xF8, 0xDD, + 0xB4, 0x71, 0xF6, 0xDF, 0xB5, 0x3B, 0xF7, 0xE5, 0xBD, 0x11, 0xF7, 0xE2, 0xBB, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF6, 0xDC, 0xB0, 0x05, 0xF6, 0xDE, 0xB5, 0x23, 0xF6, 0xDD, 0xB4, 0x51, 0xF7, 0xDD, + 0xAE, 0x8B, 0xF8, 0xDD, 0xAA, 0xBD, 0xF8, 0xDC, 0xA9, 0xE3, 0xF8, 0xDA, 0xA6, 0xF6, 0xF8, 0xDA, + 0xA4, 0xFF, 0xF8, 0xDA, 0xA4, 0xFF, 0xF9, 0xDA, 0xA4, 0xFF, 0xF9, 0xDA, 0xA4, 0xFF, 0xF9, 0xDB, + 0xA5, 0xFF, 0xFA, 0xDC, 0xA9, 0xFF, 0xF9, 0xE0, 0xB1, 0xFF, 0xF9, 0xE4, 0xBB, 0xFF, 0xF9, 0xE6, + 0xC5, 0xFF, 0xFB, 0xE9, 0xCA, 0xFF, 0xFB, 0xEA, 0xCB, 0xFF, 0xFC, 0xEB, 0xCC, 0xFF, 0xFC, 0xEB, + 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, + 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, + 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEC, 0xCD, 0xFF, 0xFC, 0xEB, 0xCC, 0xFF, 0xFC, 0xEA, + 0xCB, 0xFF, 0xFC, 0xEB, 0xCB, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, + 0xCB, 0xFF, 0xFC, 0xE9, 0xC7, 0xFF, 0xFB, 0xE7, 0xC1, 0xFF, 0xFD, 0xE4, 0xB7, 0xFF, 0xFB, 0xE0, + 0xAE, 0xFF, 0xF8, 0xDC, 0xA7, 0xFF, 0xF8, 0xDA, 0xA5, 0xFF, 0xFA, 0xDB, 0xA6, 0xFF, 0xF9, 0xDB, + 0xA5, 0xFF, 0xF9, 0xDB, 0xA7, 0xFD, 0xF7, 0xDB, 0xA6, 0xF9, 0xF8, 0xDC, 0xAB, 0xF2, 0xFC, 0xDC, + 0xA7, 0xDD, 0xFD, 0xDC, 0xA7, 0xA9, 0xFB, 0xDB, 0xAB, 0x6E, 0xF7, 0xDD, 0xC0, 0x3A, 0xE6, 0xE4, + 0xDD, 0x16, 0xE8, 0xE6, 0xDB, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0xDE, 0xB7, 0x01, 0xF5, 0xDD, 0xB6, 0x0B, 0xF6, 0xDD, + 0xB1, 0x22, 0xF7, 0xDD, 0xAE, 0x46, 0xF8, 0xDD, 0xAE, 0x77, 0xF8, 0xDE, 0xAE, 0xA8, 0xF9, 0xDE, + 0xAE, 0xCE, 0xFA, 0xDD, 0xAA, 0xED, 0xFB, 0xDD, 0xA8, 0xFD, 0xFA, 0xDC, 0xA7, 0xFF, 0xF9, 0xDC, + 0xA8, 0xFF, 0xFB, 0xDC, 0xA8, 0xFF, 0xFB, 0xDC, 0xA8, 0xFF, 0xFB, 0xDD, 0xA9, 0xFF, 0xFB, 0xDF, + 0xAE, 0xFF, 0xFB, 0xE1, 0xB4, 0xFF, 0xFC, 0xE4, 0xBA, 0xFF, 0xFD, 0xE7, 0xC0, 0xFF, 0xFC, 0xE9, + 0xC6, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEB, 0xCA, 0xFF, 0xFC, 0xEB, 0xCB, 0xFF, 0xFC, 0xEB, + 0xCB, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCD, 0xFF, 0xFC, 0xEA, 0xCD, 0xFF, 0xFC, 0xEA, + 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFD, 0xEB, 0xCC, 0xFF, 0xFD, 0xEB, 0xCB, 0xFF, 0xFD, 0xEB, + 0xC9, 0xFF, 0xFD, 0xE9, 0xC7, 0xFF, 0xFE, 0xE9, 0xC4, 0xFF, 0xFD, 0xE7, 0xC0, 0xFF, 0xFB, 0xE3, + 0xB8, 0xFF, 0xFA, 0xDF, 0xB0, 0xFF, 0xFA, 0xDF, 0xAC, 0xFF, 0xFA, 0xDC, 0xA8, 0xFF, 0xF7, 0xDB, + 0xA9, 0xFF, 0xF9, 0xDC, 0xA8, 0xFF, 0xFA, 0xDC, 0xA7, 0xFF, 0xFC, 0xDE, 0xA9, 0xFD, 0xFB, 0xDE, + 0xAA, 0xF2, 0xFB, 0xDE, 0xAD, 0xE1, 0xFD, 0xDF, 0xAF, 0xBC, 0xF9, 0xE1, 0xB5, 0x92, 0xF2, 0xDD, + 0xBB, 0x5A, 0xF3, 0xDE, 0xB2, 0x2D, 0xF2, 0xE0, 0xB0, 0x13, 0xF2, 0xE0, 0xC6, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF6, 0xDD, 0xB2, 0x03, 0xF4, 0xDF, 0xBA, 0x14, 0xF5, 0xE1, 0xBD, 0x33, 0xF9, 0xE3, + 0xB9, 0x5E, 0xFB, 0xE3, 0xB5, 0x8A, 0xFB, 0xDF, 0xB0, 0xB4, 0xFA, 0xDD, 0xAC, 0xD0, 0xFA, 0xDD, + 0xAB, 0xE8, 0xFA, 0xDD, 0xAB, 0xF4, 0xFA, 0xDD, 0xAB, 0xFB, 0xFB, 0xDD, 0xAB, 0xFF, 0xFA, 0xDD, + 0xAA, 0xFF, 0xFB, 0xDE, 0xAB, 0xFF, 0xFA, 0xDE, 0xAC, 0xFF, 0xFB, 0xE0, 0xAF, 0xFF, 0xFB, 0xE2, + 0xB2, 0xFF, 0xFC, 0xE3, 0xB7, 0xFF, 0xFA, 0xE4, 0xB9, 0xFF, 0xFA, 0xE5, 0xBC, 0xFF, 0xFA, 0xE6, + 0xBF, 0xFF, 0xFB, 0xE7, 0xC2, 0xFF, 0xFA, 0xE7, 0xC2, 0xFF, 0xFA, 0xE7, 0xC2, 0xFF, 0xFA, 0xE7, + 0xC1, 0xFF, 0xFB, 0xE7, 0xC0, 0xFF, 0xFA, 0xE5, 0xBE, 0xFF, 0xFA, 0xE4, 0xBC, 0xFF, 0xF9, 0xE2, + 0xB8, 0xFF, 0xF9, 0xE1, 0xB5, 0xFF, 0xFA, 0xE1, 0xB3, 0xFF, 0xFA, 0xE0, 0xB0, 0xFF, 0xF9, 0xDE, + 0xAC, 0xFF, 0xFB, 0xDF, 0xAC, 0xFE, 0xFB, 0xDF, 0xAC, 0xFD, 0xFA, 0xDE, 0xAD, 0xF8, 0xF9, 0xDE, + 0xAE, 0xF3, 0xFB, 0xDE, 0xAC, 0xEA, 0xFA, 0xDC, 0xA8, 0xDC, 0xF9, 0xDD, 0xAA, 0xC2, 0xF9, 0xDF, + 0xB2, 0x9E, 0xFC, 0xE2, 0xB9, 0x6D, 0xFD, 0xE1, 0xB9, 0x44, 0xF7, 0xE3, 0xC1, 0x23, 0xAC, 0xE5, + 0xFF, 0x0A, 0xA2, 0xE6, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xE2, 0xBE, 0x02, 0xF8, 0xE3, + 0xBD, 0x0B, 0xFB, 0xE4, 0xB9, 0x19, 0xFA, 0xE2, 0xB5, 0x35, 0xFB, 0xE1, 0xB4, 0x56, 0xFC, 0xE1, + 0xB3, 0x76, 0xFB, 0xE1, 0xB2, 0x97, 0xFB, 0xE0, 0xAF, 0xBA, 0xFB, 0xDF, 0xAD, 0xCF, 0xFB, 0xDF, + 0xAD, 0xE0, 0xFB, 0xDF, 0xAE, 0xEE, 0xFA, 0xDF, 0xAE, 0xF6, 0xFA, 0xDF, 0xAD, 0xFE, 0xFA, 0xDF, + 0xAE, 0xFF, 0xFA, 0xDF, 0xAE, 0xFF, 0xFB, 0xDF, 0xAF, 0xFF, 0xFB, 0xDF, 0xB0, 0xFF, 0xFB, 0xE0, + 0xAF, 0xFF, 0xFA, 0xDF, 0xAF, 0xFF, 0xFA, 0xDF, 0xAF, 0xFF, 0xFA, 0xDF, 0xAF, 0xFF, 0xF9, 0xDF, + 0xAE, 0xFF, 0xFA, 0xDE, 0xAD, 0xFF, 0xFA, 0xDF, 0xAF, 0xFF, 0xFB, 0xE0, 0xAF, 0xFF, 0xFC, 0xE1, + 0xAF, 0xFF, 0xFC, 0xE1, 0xAF, 0xFE, 0xFC, 0xE0, 0xAD, 0xFC, 0xFC, 0xE0, 0xAD, 0xF8, 0xFB, 0xE0, + 0xAD, 0xF1, 0xFB, 0xDF, 0xAD, 0xE6, 0xFC, 0xE0, 0xAF, 0xDB, 0xFC, 0xE1, 0xB1, 0xCD, 0xFB, 0xE0, + 0xB1, 0xAE, 0xFD, 0xE3, 0xB7, 0x8F, 0xFF, 0xE4, 0xBA, 0x69, 0xF8, 0xE1, 0xB7, 0x42, 0xF9, 0xE4, + 0xBD, 0x26, 0xFE, 0xE5, 0xBF, 0x12, 0xF5, 0xE2, 0xBB, 0x05, 0xEC, 0xE5, 0xC5, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0xE2, + 0xBA, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFB, 0xE3, 0xB9, 0x04, 0xFC, 0xEB, + 0xC9, 0x16, 0xFC, 0xE9, 0xC7, 0x2B, 0xFB, 0xE2, 0xB6, 0x3E, 0xFB, 0xE1, 0xB2, 0x58, 0xFB, 0xE1, + 0xB3, 0x74, 0xFB, 0xE0, 0xB2, 0x90, 0xFA, 0xE0, 0xB0, 0xA4, 0xFA, 0xE0, 0xAF, 0xBB, 0xFA, 0xDF, + 0xAD, 0xD3, 0xF9, 0xDF, 0xAD, 0xE0, 0xF9, 0xDE, 0xAD, 0xEC, 0xF9, 0xDD, 0xAC, 0xF7, 0xF9, 0xDE, + 0xAD, 0xFB, 0xFA, 0xDE, 0xAD, 0xFF, 0xF9, 0xDD, 0xAB, 0xFF, 0xFA, 0xDE, 0xAD, 0xFF, 0xF9, 0xDE, + 0xAC, 0xFF, 0xF9, 0xDF, 0xAD, 0xFF, 0xFA, 0xDE, 0xAD, 0xFE, 0xF9, 0xDE, 0xAA, 0xF2, 0xF8, 0xDC, + 0xA7, 0xE7, 0xF8, 0xDC, 0xA8, 0xD5, 0xF9, 0xDE, 0xAB, 0xC4, 0xFC, 0xE0, 0xAF, 0xAD, 0xFC, 0xE1, + 0xB2, 0x99, 0xFB, 0xE1, 0xB4, 0x7E, 0xFB, 0xE2, 0xB6, 0x67, 0xFB, 0xE2, 0xB7, 0x4A, 0xFA, 0xE2, + 0xB9, 0x31, 0xFD, 0xE9, 0xC8, 0x1D, 0xFA, 0xFE, 0xFF, 0x0D, 0xFE, 0xFF, 0xFF, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFC, 0xE9, 0xC7, 0x01, 0xFB, 0xE4, 0xBA, 0x03, 0xFC, 0xE3, 0xB6, 0x0A, 0xFC, 0xE2, + 0xB5, 0x12, 0xFB, 0xE1, 0xB3, 0x18, 0xFA, 0xE0, 0xB1, 0x22, 0xFB, 0xE0, 0xB0, 0x2C, 0xFA, 0xE0, + 0xAF, 0x33, 0xFB, 0xE1, 0xB1, 0x3E, 0xFA, 0xE1, 0xB3, 0x45, 0xFA, 0xE1, 0xB3, 0x4A, 0xFA, 0xE2, + 0xB3, 0x50, 0xFB, 0xE2, 0xB3, 0x53, 0xFC, 0xE2, 0xB5, 0x56, 0xFC, 0xE2, 0xB4, 0x55, 0xFB, 0xE2, + 0xB4, 0x51, 0xFB, 0xE2, 0xB3, 0x4B, 0xF9, 0xE0, 0xB1, 0x47, 0xFA, 0xE1, 0xB2, 0x47, 0xFA, 0xE0, + 0xB5, 0x43, 0xFA, 0xE2, 0xB6, 0x3D, 0xF9, 0xE1, 0xB3, 0x32, 0xFB, 0xE1, 0xB3, 0x28, 0xFA, 0xE2, + 0xB4, 0x20, 0xFB, 0xE2, 0xB6, 0x17, 0xFB, 0xE3, 0xB8, 0x0C, 0xFC, 0xE4, 0xBC, 0x08, 0xFB, 0xE6, + 0xC1, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xEB, 0xCA, 0x03, 0xFF, 0xED, 0xCB, 0x07, 0xFE, 0xE9, + 0xC1, 0x06, 0xFD, 0xE6, 0xBC, 0x07, 0xFC, 0xE5, 0xBB, 0x08, 0xFD, 0xE6, 0xBC, 0x08, 0xFD, 0xE8, + 0xBF, 0x07, 0xFE, 0xE9, 0xC1, 0x07, 0xFB, 0xE8, 0xC0, 0x06, 0xFF, 0xF1, 0xD2, 0x06, 0xFF, 0xFF, + 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0x01, 0xFF, 0xF0, 0xCF, 0x01, 0xFB, 0xE4, 0xB6, 0x01, 0xFC, 0xE3, + 0xB5, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xEC, 0xD0, 0x04, 0xFF, 0xED, 0xD2, 0x08, 0xFE, 0xEB, + 0xC7, 0x0A, 0xFD, 0xE7, 0xBF, 0x0B, 0xFC, 0xE6, 0xBD, 0x0C, 0xFC, 0xE7, 0xBE, 0x0D, 0xFC, 0xE9, + 0xC1, 0x0C, 0xFE, 0xE9, 0xC3, 0x0B, 0xFC, 0xE9, 0xC2, 0x09, 0xFB, 0xF0, 0xD7, 0x06, 0xFF, 0xFF, + 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x13, 0xFF, 0xFF, 0xFF, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, + 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x80, 0x00, 0x00, 0x00, + 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x01, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x1F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x28, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x90, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x54, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, + 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, + 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, + 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, + 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, + 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, + 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, + 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, + 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, + 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, + 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, + 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, + 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, + 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, + 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, + 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, + 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x0F, 0x82, 0x44, 0x0C, 0x10, 0x82, 0x44, + 0x0C, 0x11, 0x82, 0x44, 0x0C, 0x12, 0x82, 0x44, 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, + 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, + 0x0C, 0x16, 0x82, 0x44, 0x0C, 0x16, 0x82, 0x44, 0x0C, 0x16, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, + 0x0C, 0x15, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, + 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x12, 0x82, 0x44, 0x0C, 0x11, 0x82, 0x44, 0x0C, 0x11, 0x82, 0x44, + 0x0C, 0x10, 0x82, 0x44, 0x0C, 0x0F, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, + 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, + 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, + 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, + 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, + 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x10, 0x82, 0x44, + 0x0C, 0x12, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x16, 0x82, 0x44, 0x0C, 0x18, 0x82, 0x44, + 0x0C, 0x1B, 0x82, 0x44, 0x0C, 0x1D, 0x82, 0x44, 0x0C, 0x1E, 0x82, 0x44, 0x0C, 0x1F, 0x82, 0x44, + 0x0C, 0x21, 0x82, 0x44, 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x23, 0x82, 0x44, 0x0C, 0x25, 0x82, 0x44, + 0x0C, 0x25, 0x82, 0x44, 0x0C, 0x26, 0x82, 0x44, 0x0C, 0x27, 0x82, 0x44, 0x0C, 0x27, 0x82, 0x44, + 0x0C, 0x27, 0x82, 0x44, 0x0C, 0x28, 0x82, 0x44, 0x0C, 0x28, 0x82, 0x44, 0x0C, 0x27, 0x82, 0x44, + 0x0C, 0x27, 0x82, 0x44, 0x0C, 0x26, 0x82, 0x44, 0x0C, 0x26, 0x82, 0x44, 0x0C, 0x25, 0x82, 0x44, + 0x0C, 0x24, 0x82, 0x44, 0x0C, 0x23, 0x82, 0x44, 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x21, 0x82, 0x44, + 0x0C, 0x1F, 0x82, 0x44, 0x0C, 0x1D, 0x82, 0x44, 0x0C, 0x1C, 0x82, 0x44, 0x0C, 0x1A, 0x82, 0x44, + 0x0C, 0x18, 0x82, 0x44, 0x0C, 0x16, 0x82, 0x44, 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x11, 0x82, 0x44, + 0x0C, 0x0F, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, + 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, + 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, + 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x10, 0x82, 0x44, + 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x17, 0x82, 0x44, 0x0C, 0x1B, 0x82, 0x44, 0x0C, 0x1E, 0x82, 0x44, + 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x25, 0x82, 0x44, 0x0C, 0x28, 0x82, 0x44, 0x0C, 0x2B, 0x82, 0x44, + 0x0C, 0x2E, 0x82, 0x44, 0x0C, 0x31, 0x82, 0x44, 0x0C, 0x33, 0x82, 0x44, 0x0C, 0x34, 0x82, 0x44, + 0x0C, 0x37, 0x82, 0x44, 0x0C, 0x39, 0x82, 0x44, 0x0C, 0x3A, 0x82, 0x44, 0x0C, 0x3B, 0x82, 0x44, + 0x0C, 0x3C, 0x82, 0x44, 0x0C, 0x3D, 0x82, 0x44, 0x0C, 0x3F, 0x82, 0x44, 0x0C, 0x3F, 0x82, 0x44, + 0x0C, 0x3F, 0x82, 0x44, 0x0C, 0x3F, 0x82, 0x44, 0x0C, 0x3F, 0x82, 0x44, 0x0C, 0x3F, 0x82, 0x44, + 0x0C, 0x3F, 0x82, 0x44, 0x0C, 0x3E, 0x82, 0x44, 0x0C, 0x3D, 0x82, 0x44, 0x0C, 0x3C, 0x82, 0x44, + 0x0C, 0x3B, 0x82, 0x44, 0x0C, 0x39, 0x82, 0x44, 0x0C, 0x38, 0x82, 0x44, 0x0C, 0x36, 0x82, 0x44, + 0x0C, 0x34, 0x82, 0x44, 0x0C, 0x32, 0x82, 0x44, 0x0C, 0x2F, 0x82, 0x44, 0x0C, 0x2D, 0x82, 0x44, + 0x0C, 0x2A, 0x82, 0x44, 0x0C, 0x27, 0x82, 0x44, 0x0C, 0x23, 0x82, 0x44, 0x0C, 0x20, 0x82, 0x44, + 0x0C, 0x1D, 0x82, 0x44, 0x0C, 0x19, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, 0x0C, 0x11, 0x82, 0x44, + 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, + 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, + 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, + 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x11, 0x82, 0x44, 0x0C, 0x16, 0x82, 0x44, 0x0C, 0x1C, 0x82, 0x44, + 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x28, 0x82, 0x44, 0x0C, 0x2D, 0x82, 0x44, 0x0C, 0x32, 0x82, 0x44, + 0x0C, 0x37, 0x82, 0x44, 0x0C, 0x3C, 0x82, 0x44, 0x0C, 0x40, 0x82, 0x44, 0x0C, 0x43, 0x82, 0x44, + 0x0C, 0x46, 0x82, 0x44, 0x0C, 0x49, 0x82, 0x44, 0x0C, 0x4C, 0x82, 0x44, 0x0C, 0x4F, 0x82, 0x44, + 0x0C, 0x51, 0x82, 0x44, 0x0C, 0x53, 0x82, 0x44, 0x0C, 0x55, 0x82, 0x44, 0x0C, 0x56, 0x82, 0x44, + 0x0C, 0x57, 0x82, 0x44, 0x0C, 0x59, 0x82, 0x44, 0x0C, 0x5A, 0x82, 0x44, 0x0C, 0x5A, 0x82, 0x44, + 0x0C, 0x5A, 0x82, 0x44, 0x0C, 0x5A, 0x82, 0x44, 0x0C, 0x5A, 0x82, 0x44, 0x0C, 0x5A, 0x82, 0x44, + 0x0C, 0x5A, 0x82, 0x44, 0x0C, 0x5A, 0x82, 0x44, 0x0C, 0x58, 0x82, 0x44, 0x0C, 0x57, 0x82, 0x44, + 0x0C, 0x56, 0x82, 0x44, 0x0C, 0x54, 0x82, 0x44, 0x0C, 0x52, 0x82, 0x44, 0x0C, 0x50, 0x82, 0x44, + 0x0C, 0x4E, 0x82, 0x44, 0x0C, 0x4B, 0x82, 0x44, 0x0C, 0x48, 0x82, 0x44, 0x0C, 0x45, 0x82, 0x44, + 0x0C, 0x42, 0x82, 0x44, 0x0C, 0x3E, 0x82, 0x44, 0x0C, 0x39, 0x82, 0x44, 0x0C, 0x35, 0x82, 0x44, + 0x0C, 0x30, 0x82, 0x44, 0x0C, 0x2B, 0x82, 0x44, 0x0C, 0x25, 0x82, 0x44, 0x0C, 0x1F, 0x82, 0x44, + 0x0C, 0x19, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, + 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x03, 0x81, 0x43, 0x0B, 0x02, 0x81, 0x42, 0x0B, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, + 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, + 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x1B, 0x82, 0x44, 0x0C, 0x24, 0x82, 0x44, 0x0C, 0x2D, 0x82, 0x44, + 0x0C, 0x36, 0x82, 0x44, 0x0C, 0x3E, 0x82, 0x44, 0x0C, 0x45, 0x82, 0x44, 0x0C, 0x4B, 0x82, 0x44, + 0x0C, 0x51, 0x82, 0x44, 0x0C, 0x56, 0x82, 0x44, 0x0C, 0x5B, 0x82, 0x44, 0x0C, 0x5F, 0x82, 0x44, + 0x0C, 0x62, 0x82, 0x44, 0x0C, 0x66, 0x82, 0x44, 0x0C, 0x69, 0x82, 0x44, 0x0C, 0x6B, 0x82, 0x44, + 0x0C, 0x6D, 0x82, 0x44, 0x0C, 0x6F, 0x82, 0x44, 0x0C, 0x72, 0x82, 0x44, 0x0C, 0x73, 0x82, 0x44, + 0x0C, 0x74, 0x82, 0x44, 0x0C, 0x76, 0x82, 0x44, 0x0C, 0x76, 0x82, 0x44, 0x0C, 0x77, 0x82, 0x44, + 0x0C, 0x77, 0x82, 0x44, 0x0C, 0x77, 0x82, 0x44, 0x0C, 0x77, 0x82, 0x44, 0x0C, 0x77, 0x82, 0x44, + 0x0C, 0x76, 0x82, 0x44, 0x0C, 0x76, 0x82, 0x44, 0x0C, 0x75, 0x82, 0x44, 0x0C, 0x74, 0x82, 0x44, + 0x0C, 0x72, 0x82, 0x44, 0x0C, 0x70, 0x82, 0x44, 0x0C, 0x6E, 0x82, 0x44, 0x0C, 0x6D, 0x82, 0x44, + 0x0C, 0x6A, 0x82, 0x44, 0x0C, 0x67, 0x82, 0x44, 0x0C, 0x64, 0x82, 0x44, 0x0C, 0x60, 0x82, 0x44, + 0x0C, 0x5D, 0x82, 0x44, 0x0C, 0x58, 0x82, 0x44, 0x0C, 0x53, 0x82, 0x44, 0x0C, 0x4E, 0x82, 0x44, + 0x0C, 0x48, 0x82, 0x44, 0x0C, 0x42, 0x82, 0x44, 0x0C, 0x3A, 0x82, 0x44, 0x0C, 0x32, 0x82, 0x44, + 0x0C, 0x29, 0x82, 0x44, 0x0C, 0x20, 0x82, 0x44, 0x0C, 0x17, 0x82, 0x44, 0x0C, 0x10, 0x82, 0x44, + 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x05, 0x81, 0x43, 0x0B, 0x03, 0x85, 0x48, 0x12, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x42, 0x09, 0x01, 0x82, 0x44, + 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x13, 0x82, 0x44, + 0x0C, 0x1D, 0x82, 0x44, 0x0C, 0x28, 0x82, 0x44, 0x0C, 0x34, 0x82, 0x44, 0x0C, 0x41, 0x82, 0x44, + 0x0C, 0x4C, 0x82, 0x44, 0x0C, 0x56, 0x82, 0x44, 0x0C, 0x5F, 0x82, 0x44, 0x0C, 0x66, 0x82, 0x44, + 0x0C, 0x6C, 0x82, 0x44, 0x0C, 0x72, 0x82, 0x44, 0x0C, 0x76, 0x82, 0x44, 0x0C, 0x7B, 0x82, 0x44, + 0x0C, 0x7E, 0x82, 0x44, 0x0C, 0x82, 0x82, 0x44, 0x0C, 0x84, 0x82, 0x44, 0x0C, 0x87, 0x82, 0x44, + 0x0C, 0x89, 0x82, 0x44, 0x0C, 0x8B, 0x82, 0x44, 0x0B, 0x8D, 0x81, 0x43, 0x0B, 0x8D, 0x81, 0x43, + 0x0A, 0x8E, 0x81, 0x42, 0x09, 0x8F, 0x81, 0x42, 0x09, 0x90, 0x80, 0x41, 0x08, 0x90, 0x80, 0x41, + 0x08, 0x90, 0x80, 0x41, 0x08, 0x90, 0x81, 0x41, 0x08, 0x91, 0x81, 0x42, 0x09, 0x90, 0x81, 0x42, + 0x0A, 0x90, 0x81, 0x43, 0x0B, 0x90, 0x82, 0x43, 0x0B, 0x8F, 0x82, 0x44, 0x0C, 0x8E, 0x82, 0x44, + 0x0C, 0x8D, 0x82, 0x44, 0x0C, 0x8C, 0x82, 0x44, 0x0C, 0x8A, 0x82, 0x44, 0x0C, 0x88, 0x82, 0x44, + 0x0C, 0x86, 0x82, 0x44, 0x0C, 0x83, 0x82, 0x44, 0x0C, 0x80, 0x82, 0x44, 0x0C, 0x7D, 0x82, 0x44, + 0x0C, 0x78, 0x82, 0x44, 0x0C, 0x74, 0x82, 0x44, 0x0C, 0x6F, 0x82, 0x44, 0x0C, 0x69, 0x82, 0x44, + 0x0C, 0x62, 0x82, 0x44, 0x0C, 0x5B, 0x82, 0x44, 0x0C, 0x52, 0x82, 0x44, 0x0C, 0x47, 0x82, 0x44, + 0x0C, 0x3B, 0x82, 0x44, 0x0C, 0x2E, 0x82, 0x44, 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x17, 0x82, 0x44, + 0x0C, 0x0F, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x43, 0x0C, 0x02, 0x9A, 0x68, + 0x3B, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x42, 0x0A, 0x01, 0x82, 0x44, + 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x0F, 0x82, 0x44, 0x0C, 0x19, 0x82, 0x44, + 0x0C, 0x26, 0x82, 0x44, 0x0C, 0x35, 0x82, 0x44, 0x0C, 0x44, 0x82, 0x44, 0x0C, 0x53, 0x82, 0x44, + 0x0C, 0x61, 0x82, 0x44, 0x0C, 0x6D, 0x82, 0x44, 0x0C, 0x77, 0x82, 0x44, 0x0C, 0x7E, 0x82, 0x44, + 0x0C, 0x85, 0x82, 0x44, 0x0C, 0x8A, 0x82, 0x44, 0x0C, 0x8F, 0x82, 0x44, 0x0C, 0x93, 0x82, 0x44, + 0x0C, 0x97, 0x82, 0x44, 0x0C, 0x9A, 0x82, 0x44, 0x0C, 0x9C, 0x81, 0x43, 0x0B, 0x9D, 0x81, 0x42, + 0x09, 0x9E, 0x81, 0x43, 0x0A, 0xA0, 0x84, 0x46, 0x0E, 0xA3, 0x87, 0x4C, 0x15, 0xA8, 0x8B, 0x52, + 0x1F, 0xAD, 0x90, 0x5B, 0x2B, 0xB5, 0x93, 0x5F, 0x32, 0xBA, 0x94, 0x61, 0x34, 0xBD, 0x94, 0x61, + 0x34, 0xBF, 0x94, 0x61, 0x34, 0xBE, 0x94, 0x60, 0x33, 0xBC, 0x92, 0x5D, 0x2E, 0xB8, 0x8D, 0x55, + 0x23, 0xB1, 0x89, 0x4E, 0x19, 0xAB, 0x85, 0x47, 0x11, 0xA7, 0x82, 0x44, 0x0B, 0xA4, 0x81, 0x42, + 0x09, 0xA2, 0x81, 0x43, 0x0A, 0xA1, 0x82, 0x44, 0x0B, 0xA0, 0x82, 0x44, 0x0C, 0x9F, 0x82, 0x44, + 0x0C, 0x9D, 0x82, 0x44, 0x0C, 0x9B, 0x82, 0x44, 0x0C, 0x98, 0x82, 0x44, 0x0C, 0x95, 0x82, 0x44, + 0x0C, 0x91, 0x82, 0x44, 0x0C, 0x8D, 0x82, 0x44, 0x0C, 0x88, 0x82, 0x44, 0x0C, 0x82, 0x82, 0x44, + 0x0C, 0x7B, 0x82, 0x44, 0x0C, 0x72, 0x82, 0x44, 0x0C, 0x67, 0x82, 0x44, 0x0C, 0x5B, 0x82, 0x44, + 0x0C, 0x4C, 0x82, 0x44, 0x0C, 0x3D, 0x82, 0x44, 0x0C, 0x2D, 0x82, 0x44, 0x0C, 0x1F, 0x82, 0x44, + 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x06, 0x81, 0x43, 0x0B, 0x03, 0x89, 0x4E, + 0x1B, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x62, 0x32, 0x01, 0x81, 0x43, 0x0B, 0x02, 0x82, 0x44, + 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x12, 0x82, 0x44, 0x0C, 0x1E, 0x82, 0x44, + 0x0C, 0x2D, 0x82, 0x44, 0x0C, 0x3E, 0x82, 0x44, 0x0C, 0x50, 0x82, 0x44, 0x0C, 0x61, 0x82, 0x44, + 0x0C, 0x71, 0x82, 0x44, 0x0C, 0x7D, 0x82, 0x44, 0x0C, 0x88, 0x82, 0x44, 0x0C, 0x8F, 0x82, 0x44, + 0x0C, 0x96, 0x82, 0x44, 0x0C, 0x9C, 0x82, 0x44, 0x0C, 0xA0, 0x82, 0x44, 0x0C, 0xA4, 0x82, 0x43, + 0x0B, 0xA7, 0x81, 0x42, 0x09, 0xA8, 0x83, 0x45, 0x0D, 0xAB, 0x89, 0x4F, 0x1A, 0xB3, 0x92, 0x5E, + 0x2F, 0xC1, 0x9A, 0x6C, 0x44, 0xD1, 0x9F, 0x74, 0x51, 0xDF, 0x9E, 0x75, 0x56, 0xE8, 0x9D, 0x76, + 0x59, 0xF1, 0x9C, 0x76, 0x5A, 0xF8, 0x9B, 0x75, 0x5A, 0xFB, 0x9A, 0x74, 0x5A, 0xFD, 0x99, 0x74, + 0x5A, 0xFD, 0x9A, 0x75, 0x5B, 0xFD, 0x9C, 0x76, 0x5C, 0xFC, 0x9E, 0x79, 0x5E, 0xF9, 0x9F, 0x79, + 0x5D, 0xF4, 0xA0, 0x79, 0x5A, 0xEC, 0xA0, 0x77, 0x57, 0xE4, 0x9E, 0x72, 0x4D, 0xD8, 0x96, 0x65, + 0x39, 0xC9, 0x8C, 0x55, 0x22, 0xBB, 0x85, 0x48, 0x11, 0xB1, 0x81, 0x42, 0x0A, 0xAD, 0x81, 0x43, + 0x0A, 0xAC, 0x82, 0x44, 0x0C, 0xAB, 0x82, 0x44, 0x0C, 0xA8, 0x82, 0x44, 0x0C, 0xA6, 0x82, 0x44, + 0x0C, 0xA2, 0x82, 0x44, 0x0C, 0x9E, 0x82, 0x44, 0x0C, 0x99, 0x82, 0x44, 0x0C, 0x94, 0x82, 0x44, + 0x0C, 0x8C, 0x82, 0x44, 0x0C, 0x83, 0x82, 0x44, 0x0C, 0x78, 0x82, 0x44, 0x0C, 0x69, 0x82, 0x44, + 0x0C, 0x59, 0x82, 0x44, 0x0C, 0x47, 0x82, 0x44, 0x0C, 0x35, 0x82, 0x44, 0x0C, 0x25, 0x82, 0x44, + 0x0C, 0x17, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x03, 0x83, 0x46, + 0x0E, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x62, 0x33, 0x01, 0x81, 0x43, 0x0B, 0x02, 0x82, 0x44, + 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x20, 0x82, 0x44, + 0x0C, 0x30, 0x82, 0x44, 0x0C, 0x42, 0x82, 0x44, 0x0C, 0x55, 0x82, 0x44, 0x0C, 0x67, 0x82, 0x44, + 0x0C, 0x77, 0x82, 0x44, 0x0C, 0x84, 0x82, 0x44, 0x0C, 0x8F, 0x82, 0x44, 0x0C, 0x97, 0x82, 0x44, + 0x0C, 0x9E, 0x82, 0x44, 0x0C, 0xA3, 0x81, 0x43, 0x0B, 0xA6, 0x81, 0x42, 0x0A, 0xA8, 0x87, 0x4C, + 0x15, 0xB1, 0x94, 0x60, 0x32, 0xC4, 0x9D, 0x71, 0x4C, 0xDB, 0x9E, 0x76, 0x57, 0xEE, 0x99, 0x72, + 0x56, 0xFA, 0x90, 0x68, 0x4D, 0xFE, 0x89, 0x60, 0x45, 0xFF, 0x83, 0x59, 0x3F, 0xFF, 0x7F, 0x54, + 0x3A, 0xFF, 0x7C, 0x50, 0x36, 0xFF, 0x7A, 0x4E, 0x34, 0xFF, 0x79, 0x4D, 0x34, 0xFF, 0x79, 0x4D, + 0x34, 0xFF, 0x7B, 0x4F, 0x35, 0xFF, 0x7C, 0x51, 0x37, 0xFF, 0x7F, 0x55, 0x3B, 0xFF, 0x83, 0x59, + 0x40, 0xFF, 0x88, 0x5F, 0x46, 0xFF, 0x8E, 0x67, 0x4D, 0xFF, 0x95, 0x6F, 0x55, 0xFF, 0x9D, 0x77, + 0x5D, 0xFC, 0xA2, 0x7C, 0x60, 0xF5, 0xA1, 0x78, 0x56, 0xE5, 0x99, 0x69, 0x3F, 0xD0, 0x8B, 0x53, + 0x1F, 0xBB, 0x82, 0x44, 0x0C, 0xB0, 0x81, 0x42, 0x0A, 0xAD, 0x82, 0x44, 0x0C, 0xAC, 0x82, 0x44, + 0x0C, 0xA9, 0x82, 0x44, 0x0C, 0xA5, 0x82, 0x44, 0x0C, 0xA0, 0x82, 0x44, 0x0C, 0x9B, 0x82, 0x44, + 0x0C, 0x94, 0x82, 0x44, 0x0C, 0x8A, 0x82, 0x44, 0x0C, 0x7F, 0x82, 0x44, 0x0C, 0x70, 0x82, 0x44, + 0x0C, 0x5E, 0x82, 0x44, 0x0C, 0x4C, 0x82, 0x44, 0x0C, 0x39, 0x82, 0x44, 0x0C, 0x28, 0x82, 0x44, + 0x0C, 0x19, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x03, 0x83, 0x44, + 0x0D, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x62, 0x33, 0x01, 0x81, 0x43, 0x0B, 0x02, 0x82, 0x44, + 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x12, 0x82, 0x44, 0x0C, 0x1F, 0x82, 0x44, + 0x0C, 0x2E, 0x82, 0x44, 0x0C, 0x3F, 0x82, 0x44, 0x0C, 0x51, 0x82, 0x44, 0x0C, 0x63, 0x82, 0x44, + 0x0C, 0x73, 0x82, 0x44, 0x0C, 0x80, 0x82, 0x44, 0x0C, 0x8A, 0x82, 0x44, 0x0C, 0x92, 0x81, 0x43, + 0x0B, 0x98, 0x81, 0x43, 0x0A, 0x9B, 0x8A, 0x50, 0x1C, 0xA9, 0x99, 0x69, 0x40, 0xC8, 0x9F, 0x76, + 0x56, 0xE8, 0x97, 0x70, 0x53, 0xFA, 0x8B, 0x61, 0x45, 0xFF, 0x7E, 0x53, 0x37, 0xFF, 0x76, 0x48, + 0x2D, 0xFF, 0x71, 0x43, 0x28, 0xFF, 0x6F, 0x41, 0x26, 0xFF, 0x6E, 0x40, 0x25, 0xFF, 0x6E, 0x40, + 0x25, 0xFF, 0x6F, 0x40, 0x26, 0xFF, 0x70, 0x41, 0x26, 0xFF, 0x71, 0x42, 0x27, 0xFF, 0x71, 0x43, + 0x28, 0xFF, 0x72, 0x44, 0x29, 0xFF, 0x73, 0x46, 0x2A, 0xFF, 0x74, 0x47, 0x2C, 0xFF, 0x75, 0x49, + 0x2E, 0xFF, 0x76, 0x4A, 0x2F, 0xFF, 0x78, 0x4C, 0x32, 0xFF, 0x7B, 0x50, 0x35, 0xFF, 0x81, 0x56, + 0x3C, 0xFF, 0x88, 0x5F, 0x45, 0xFF, 0x93, 0x6B, 0x51, 0xFF, 0x9D, 0x78, 0x5D, 0xFD, 0xA4, 0x7E, + 0x61, 0xF1, 0x9F, 0x73, 0x4F, 0xD9, 0x90, 0x5A, 0x2A, 0xBA, 0x83, 0x45, 0x0D, 0xA7, 0x81, 0x42, + 0x0A, 0xA3, 0x82, 0x44, 0x0C, 0xA0, 0x82, 0x44, 0x0C, 0x9C, 0x82, 0x44, 0x0C, 0x96, 0x82, 0x44, + 0x0C, 0x8F, 0x82, 0x44, 0x0C, 0x85, 0x82, 0x44, 0x0C, 0x7A, 0x82, 0x44, 0x0C, 0x6B, 0x82, 0x44, + 0x0C, 0x5B, 0x82, 0x44, 0x0C, 0x49, 0x82, 0x44, 0x0C, 0x37, 0x82, 0x44, 0x0C, 0x26, 0x82, 0x44, + 0x0C, 0x18, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x03, 0x83, 0x45, + 0x0D, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x42, 0x0A, 0x02, 0x82, 0x44, + 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x0F, 0x82, 0x44, 0x0C, 0x1A, 0x82, 0x44, + 0x0C, 0x27, 0x82, 0x44, 0x0C, 0x37, 0x82, 0x44, 0x0C, 0x47, 0x82, 0x44, 0x0C, 0x56, 0x82, 0x44, + 0x0C, 0x65, 0x82, 0x44, 0x0C, 0x70, 0x82, 0x44, 0x0C, 0x7A, 0x81, 0x42, 0x09, 0x7F, 0x88, 0x4C, + 0x16, 0x8E, 0x9B, 0x6B, 0x42, 0xB9, 0x9F, 0x76, 0x57, 0xE7, 0x93, 0x6A, 0x4D, 0xFC, 0x81, 0x55, + 0x38, 0xFF, 0x74, 0x45, 0x29, 0xFF, 0x6D, 0x3D, 0x21, 0xFF, 0x6A, 0x3A, 0x1F, 0xFF, 0x6A, 0x3A, + 0x1E, 0xFF, 0x6B, 0x3B, 0x1F, 0xFF, 0x6D, 0x3C, 0x20, 0xFF, 0x6E, 0x3E, 0x21, 0xFF, 0x6F, 0x40, + 0x22, 0xFF, 0x71, 0x41, 0x23, 0xFF, 0x73, 0x43, 0x25, 0xFF, 0x74, 0x44, 0x26, 0xFF, 0x75, 0x45, + 0x27, 0xFF, 0x76, 0x46, 0x28, 0xFF, 0x76, 0x47, 0x29, 0xFF, 0x77, 0x48, 0x2A, 0xFF, 0x77, 0x49, + 0x2B, 0xFF, 0x78, 0x49, 0x2C, 0xFF, 0x78, 0x4A, 0x2D, 0xFF, 0x78, 0x4B, 0x2E, 0xFF, 0x78, 0x4B, + 0x2F, 0xFF, 0x7A, 0x4D, 0x31, 0xFF, 0x7D, 0x50, 0x35, 0xFF, 0x83, 0x58, 0x3C, 0xFF, 0x8D, 0x64, + 0x49, 0xFF, 0x9A, 0x74, 0x5A, 0xFF, 0xA5, 0x7F, 0x63, 0xF4, 0xA2, 0x77, 0x53, 0xD2, 0x8E, 0x57, + 0x25, 0xA4, 0x81, 0x43, 0x0A, 0x8E, 0x81, 0x43, 0x0B, 0x8B, 0x82, 0x44, 0x0C, 0x86, 0x82, 0x44, + 0x0C, 0x7F, 0x82, 0x44, 0x0C, 0x76, 0x82, 0x44, 0x0C, 0x6B, 0x82, 0x44, 0x0C, 0x5E, 0x82, 0x44, + 0x0C, 0x4F, 0x82, 0x44, 0x0C, 0x3F, 0x82, 0x44, 0x0C, 0x2F, 0x82, 0x44, 0x0C, 0x21, 0x82, 0x44, + 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x43, 0x0B, 0x03, 0x86, 0x4A, + 0x15, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x42, 0x09, 0x01, 0x82, 0x44, + 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, + 0x0C, 0x1E, 0x82, 0x44, 0x0C, 0x2A, 0x82, 0x44, 0x0C, 0x37, 0x82, 0x44, 0x0C, 0x44, 0x82, 0x44, + 0x0C, 0x50, 0x81, 0x43, 0x0A, 0x5A, 0x83, 0x46, 0x0E, 0x62, 0x97, 0x65, 0x38, 0x8D, 0xA1, 0x77, + 0x56, 0xD3, 0x94, 0x6A, 0x4D, 0xFA, 0x7E, 0x50, 0x33, 0xFF, 0x6F, 0x3F, 0x22, 0xFF, 0x69, 0x38, + 0x1B, 0xFF, 0x67, 0x36, 0x19, 0xFF, 0x68, 0x37, 0x19, 0xFF, 0x6A, 0x38, 0x1A, 0xFF, 0x6C, 0x3A, + 0x1C, 0xFF, 0x6E, 0x3D, 0x1D, 0xFF, 0x71, 0x3F, 0x1F, 0xFF, 0x72, 0x41, 0x20, 0xFF, 0x74, 0x42, + 0x21, 0xFF, 0x76, 0x44, 0x22, 0xFF, 0x77, 0x46, 0x24, 0xFF, 0x78, 0x47, 0x25, 0xFF, 0x79, 0x48, + 0x26, 0xFF, 0x7A, 0x49, 0x27, 0xFF, 0x7B, 0x4A, 0x28, 0xFF, 0x7C, 0x4B, 0x29, 0xFF, 0x7C, 0x4C, + 0x2A, 0xFF, 0x7C, 0x4C, 0x2B, 0xFF, 0x7D, 0x4D, 0x2C, 0xFF, 0x7C, 0x4D, 0x2D, 0xFF, 0x7C, 0x4D, + 0x2E, 0xFF, 0x7C, 0x4D, 0x2F, 0xFF, 0x7B, 0x4D, 0x2F, 0xFF, 0x7C, 0x4E, 0x31, 0xFF, 0x7D, 0x50, + 0x34, 0xFF, 0x82, 0x56, 0x3A, 0xFF, 0x8D, 0x63, 0x47, 0xFF, 0x9C, 0x76, 0x5B, 0xFF, 0xA6, 0x81, + 0x64, 0xE9, 0x9F, 0x72, 0x4A, 0xAF, 0x89, 0x4F, 0x19, 0x7B, 0x81, 0x42, 0x09, 0x6C, 0x82, 0x44, + 0x0C, 0x67, 0x82, 0x44, 0x0C, 0x5F, 0x82, 0x44, 0x0C, 0x56, 0x82, 0x44, 0x0C, 0x4B, 0x82, 0x44, + 0x0C, 0x3E, 0x82, 0x44, 0x0C, 0x31, 0x82, 0x44, 0x0C, 0x24, 0x82, 0x44, 0x0C, 0x19, 0x82, 0x44, + 0x0C, 0x10, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x05, 0x81, 0x43, 0x0B, 0x02, 0x94, 0x60, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, 0x0B, 0x01, 0x82, 0x44, + 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, + 0x0C, 0x15, 0x82, 0x44, 0x0C, 0x1E, 0x82, 0x44, 0x0C, 0x27, 0x82, 0x44, 0x0C, 0x31, 0x80, 0x41, + 0x08, 0x37, 0x8E, 0x56, 0x23, 0x4C, 0xA4, 0x7A, 0x57, 0x9E, 0x9C, 0x74, 0x56, 0xEC, 0x84, 0x57, + 0x38, 0xFF, 0x70, 0x3F, 0x21, 0xFF, 0x68, 0x36, 0x18, 0xFF, 0x66, 0x34, 0x15, 0xFF, 0x67, 0x35, + 0x16, 0xFF, 0x69, 0x37, 0x17, 0xFF, 0x6C, 0x39, 0x19, 0xFF, 0x6E, 0x3B, 0x1A, 0xFF, 0x71, 0x3E, + 0x1B, 0xFF, 0x73, 0x40, 0x1D, 0xFF, 0x75, 0x42, 0x1E, 0xFF, 0x77, 0x44, 0x20, 0xFF, 0x79, 0x45, + 0x21, 0xFF, 0x7A, 0x47, 0x22, 0xFF, 0x7C, 0x49, 0x23, 0xFF, 0x7D, 0x4A, 0x24, 0xFF, 0x7E, 0x4B, + 0x25, 0xFF, 0x7F, 0x4C, 0x26, 0xFF, 0x80, 0x4D, 0x27, 0xFF, 0x81, 0x4E, 0x28, 0xFF, 0x81, 0x4F, + 0x29, 0xFF, 0x81, 0x4F, 0x2A, 0xFF, 0x81, 0x50, 0x2B, 0xFF, 0x81, 0x50, 0x2C, 0xFF, 0x81, 0x50, + 0x2D, 0xFF, 0x81, 0x50, 0x2E, 0xFF, 0x80, 0x50, 0x2E, 0xFF, 0x7F, 0x50, 0x2F, 0xFF, 0x7E, 0x50, + 0x30, 0xFF, 0x7E, 0x50, 0x31, 0xFF, 0x80, 0x52, 0x35, 0xFF, 0x85, 0x5A, 0x3C, 0xFF, 0x92, 0x6A, + 0x4D, 0xFF, 0xA3, 0x7E, 0x62, 0xFA, 0xAA, 0x84, 0x64, 0xC8, 0x98, 0x66, 0x38, 0x72, 0x81, 0x42, + 0x09, 0x4B, 0x82, 0x43, 0x0B, 0x47, 0x82, 0x44, 0x0C, 0x3F, 0x82, 0x44, 0x0C, 0x36, 0x82, 0x44, + 0x0C, 0x2C, 0x82, 0x44, 0x0C, 0x23, 0x82, 0x44, 0x0C, 0x19, 0x82, 0x44, 0x0C, 0x11, 0x82, 0x44, + 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0B, 0x03, 0x85, 0x49, 0x13, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, + 0x0E, 0x01, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, + 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x13, 0x82, 0x44, 0x0B, 0x19, 0x7D, 0x3C, 0x01, 0x1B, 0x9F, 0x70, + 0x46, 0x41, 0xA6, 0x7F, 0x60, 0xB4, 0x90, 0x65, 0x46, 0xF9, 0x75, 0x44, 0x24, 0xFF, 0x66, 0x32, + 0x13, 0xFF, 0x61, 0x2C, 0x0E, 0xFF, 0x61, 0x2B, 0x0C, 0xFF, 0x63, 0x2D, 0x0C, 0xFF, 0x65, 0x2E, + 0x0C, 0xFF, 0x68, 0x30, 0x0D, 0xFF, 0x6A, 0x32, 0x0E, 0xFF, 0x6D, 0x35, 0x0F, 0xFF, 0x6F, 0x38, + 0x11, 0xFF, 0x72, 0x3A, 0x13, 0xFF, 0x75, 0x3D, 0x14, 0xFF, 0x77, 0x40, 0x16, 0xFF, 0x7A, 0x43, + 0x19, 0xFF, 0x7D, 0x46, 0x1C, 0xFF, 0x7F, 0x49, 0x20, 0xFF, 0x81, 0x4C, 0x22, 0xFF, 0x83, 0x4E, + 0x24, 0xFF, 0x84, 0x4F, 0x26, 0xFF, 0x85, 0x50, 0x27, 0xFF, 0x85, 0x51, 0x29, 0xFF, 0x86, 0x51, + 0x29, 0xFF, 0x86, 0x52, 0x2A, 0xFF, 0x86, 0x52, 0x2B, 0xFF, 0x86, 0x53, 0x2C, 0xFF, 0x86, 0x53, + 0x2D, 0xFF, 0x85, 0x53, 0x2E, 0xFF, 0x85, 0x53, 0x2E, 0xFF, 0x84, 0x53, 0x2F, 0xFF, 0x83, 0x53, + 0x30, 0xFF, 0x82, 0x52, 0x30, 0xFF, 0x81, 0x52, 0x31, 0xFF, 0x80, 0x52, 0x33, 0xFF, 0x83, 0x55, + 0x37, 0xFF, 0x8C, 0x60, 0x43, 0xFF, 0x9C, 0x75, 0x59, 0xFF, 0xAB, 0x88, 0x6B, 0xDE, 0xA7, 0x7D, + 0x58, 0x72, 0x83, 0x45, 0x0D, 0x2D, 0x81, 0x42, 0x0A, 0x28, 0x82, 0x44, 0x0C, 0x23, 0x82, 0x44, + 0x0C, 0x1C, 0x82, 0x44, 0x0C, 0x16, 0x82, 0x44, 0x0C, 0x10, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, + 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x03, 0x81, 0x43, 0x0A, 0x02, 0x94, 0x5F, 0x2E, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x4A, + 0x13, 0x01, 0x81, 0x43, 0x0B, 0x01, 0x82, 0x44, 0x0B, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, + 0x0C, 0x07, 0x81, 0x42, 0x0A, 0x0A, 0x77, 0x31, 0x00, 0x09, 0xB0, 0x8A, 0x69, 0x3F, 0xA4, 0x7D, + 0x5E, 0xC8, 0x85, 0x57, 0x36, 0xFF, 0x6A, 0x35, 0x14, 0xFF, 0x5F, 0x29, 0x09, 0xFF, 0x5D, 0x26, + 0x05, 0xFF, 0x5F, 0x27, 0x05, 0xFF, 0x62, 0x29, 0x05, 0xFF, 0x64, 0x2B, 0x05, 0xFF, 0x67, 0x2D, + 0x06, 0xFF, 0x69, 0x2F, 0x06, 0xFF, 0x6B, 0x30, 0x07, 0xFF, 0x6D, 0x32, 0x07, 0xFF, 0x70, 0x34, + 0x07, 0xFF, 0x72, 0x35, 0x08, 0xFF, 0x73, 0x37, 0x08, 0xFF, 0x75, 0x38, 0x09, 0xFF, 0x76, 0x39, + 0x0A, 0xFF, 0x78, 0x3B, 0x0B, 0xFF, 0x79, 0x3D, 0x0D, 0xFF, 0x7B, 0x40, 0x10, 0xFF, 0x7E, 0x43, + 0x13, 0xFF, 0x81, 0x48, 0x18, 0xFF, 0x84, 0x4C, 0x1E, 0xFF, 0x87, 0x50, 0x23, 0xFF, 0x89, 0x53, + 0x27, 0xFF, 0x8A, 0x55, 0x29, 0xFF, 0x8A, 0x56, 0x2A, 0xFF, 0x8A, 0x56, 0x2B, 0xFF, 0x8A, 0x56, + 0x2C, 0xFF, 0x8A, 0x56, 0x2D, 0xFF, 0x89, 0x56, 0x2D, 0xFF, 0x89, 0x56, 0x2E, 0xFF, 0x88, 0x56, + 0x2F, 0xFF, 0x87, 0x55, 0x2F, 0xFF, 0x85, 0x55, 0x30, 0xFF, 0x84, 0x54, 0x31, 0xFF, 0x83, 0x53, + 0x31, 0xFF, 0x83, 0x55, 0x34, 0xFF, 0x89, 0x5C, 0x3D, 0xFF, 0x97, 0x6F, 0x51, 0xFF, 0xAB, 0x86, + 0x6A, 0xEA, 0xB1, 0x8D, 0x6E, 0x78, 0x8E, 0x56, 0x23, 0x1A, 0x7F, 0x3F, 0x05, 0x12, 0x82, 0x44, + 0x0C, 0x10, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, + 0x0C, 0x03, 0x81, 0x43, 0x0B, 0x02, 0x80, 0x41, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x8B, 0x51, 0x1D, 0x01, 0x85, 0x48, 0x11, 0x01, 0x82, 0x44, 0x0C, 0x02, 0x7E, 0x3D, + 0x03, 0x03, 0x5C, 0x09, 0x00, 0x02, 0xB7, 0x95, 0x77, 0x3E, 0xA3, 0x7B, 0x5C, 0xD0, 0x81, 0x50, + 0x2D, 0xFF, 0x67, 0x31, 0x0F, 0xFF, 0x5F, 0x28, 0x07, 0xFF, 0x5F, 0x28, 0x05, 0xFF, 0x62, 0x2A, + 0x05, 0xFF, 0x65, 0x2C, 0x06, 0xFF, 0x67, 0x2E, 0x06, 0xFF, 0x6A, 0x30, 0x07, 0xFF, 0x6D, 0x32, + 0x07, 0xFF, 0x70, 0x34, 0x08, 0xFF, 0x72, 0x36, 0x08, 0xFF, 0x74, 0x38, 0x08, 0xFF, 0x76, 0x39, + 0x09, 0xFF, 0x78, 0x3B, 0x09, 0xFF, 0x79, 0x3C, 0x09, 0xFF, 0x7A, 0x3C, 0x09, 0xFF, 0x7B, 0x3D, + 0x0A, 0xFF, 0x7B, 0x3E, 0x09, 0xFF, 0x7C, 0x3E, 0x09, 0xFF, 0x7C, 0x3E, 0x09, 0xFF, 0x7C, 0x3E, + 0x09, 0xFF, 0x7D, 0x3E, 0x0A, 0xFF, 0x7E, 0x40, 0x0B, 0xFF, 0x7F, 0x42, 0x0E, 0xFF, 0x82, 0x46, + 0x13, 0xFF, 0x85, 0x4B, 0x19, 0xFF, 0x89, 0x51, 0x20, 0xFF, 0x8C, 0x56, 0x27, 0xFF, 0x8D, 0x58, + 0x2B, 0xFF, 0x8E, 0x59, 0x2C, 0xFF, 0x8D, 0x59, 0x2C, 0xFF, 0x8D, 0x59, 0x2D, 0xFF, 0x8C, 0x59, + 0x2E, 0xFF, 0x8B, 0x58, 0x2F, 0xFF, 0x8A, 0x58, 0x2F, 0xFF, 0x89, 0x57, 0x30, 0xFF, 0x87, 0x56, + 0x30, 0xFF, 0x85, 0x55, 0x31, 0xFF, 0x84, 0x55, 0x33, 0xFF, 0x88, 0x5A, 0x39, 0xFF, 0x95, 0x6B, + 0x4C, 0xFF, 0xAA, 0x86, 0x6A, 0xF2, 0xB6, 0x95, 0x79, 0x7C, 0x9D, 0x6D, 0x41, 0x0F, 0x78, 0x34, + 0x00, 0x06, 0x82, 0x44, 0x0D, 0x06, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x43, 0x0B, 0x02, 0x82, 0x44, + 0x0D, 0x01, 0x86, 0x49, 0x13, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xBB, 0x9A, 0x7E, 0x37, 0xA3, 0x7C, 0x5D, 0xCF, 0x7F, 0x4E, 0x2B, 0xFF, 0x67, 0x30, + 0x0E, 0xFF, 0x60, 0x29, 0x07, 0xFF, 0x61, 0x29, 0x06, 0xFF, 0x64, 0x2B, 0x06, 0xFF, 0x68, 0x2E, + 0x06, 0xFF, 0x6A, 0x30, 0x07, 0xFF, 0x6C, 0x32, 0x08, 0xFF, 0x6D, 0x34, 0x08, 0xFF, 0x6E, 0x35, + 0x08, 0xFF, 0x72, 0x38, 0x09, 0xFF, 0x77, 0x3A, 0x09, 0xFF, 0x79, 0x3C, 0x0A, 0xFF, 0x7B, 0x3E, + 0x0A, 0xFF, 0x7D, 0x3F, 0x0A, 0xFF, 0x7E, 0x3F, 0x0B, 0xFF, 0x7F, 0x40, 0x0B, 0xFF, 0x7F, 0x41, + 0x0B, 0xFF, 0x80, 0x41, 0x0B, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x81, 0x42, + 0x0B, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x81, 0x42, 0x0A, 0xFF, 0x81, 0x42, + 0x0A, 0xFF, 0x81, 0x42, 0x0A, 0xFF, 0x81, 0x43, 0x0C, 0xFF, 0x84, 0x46, 0x11, 0xFF, 0x87, 0x4C, + 0x18, 0xFF, 0x8C, 0x53, 0x22, 0xFF, 0x8F, 0x59, 0x29, 0xFF, 0x90, 0x5B, 0x2D, 0xFF, 0x90, 0x5B, + 0x2E, 0xFF, 0x8F, 0x5B, 0x2E, 0xFF, 0x8E, 0x5A, 0x2F, 0xFF, 0x8D, 0x5A, 0x2F, 0xFF, 0x8B, 0x59, + 0x30, 0xFF, 0x8A, 0x58, 0x31, 0xFF, 0x88, 0x57, 0x31, 0xFF, 0x87, 0x56, 0x33, 0xFF, 0x89, 0x5A, + 0x38, 0xFF, 0x95, 0x6A, 0x4A, 0xFF, 0xAB, 0x87, 0x6A, 0xF3, 0xBA, 0x99, 0x7E, 0x74, 0xA8, 0x7C, + 0x51, 0x07, 0x61, 0x13, 0x00, 0x01, 0x83, 0x45, 0x0D, 0x01, 0x85, 0x48, 0x11, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC5, 0xA9, + 0x90, 0x2C, 0xA7, 0x80, 0x61, 0xC6, 0x83, 0x51, 0x2D, 0xFF, 0x69, 0x32, 0x0F, 0xFF, 0x63, 0x2A, + 0x07, 0xFF, 0x64, 0x2A, 0x06, 0xFF, 0x66, 0x2D, 0x07, 0xFF, 0x6A, 0x30, 0x07, 0xFF, 0x6D, 0x32, + 0x08, 0xFF, 0x6E, 0x34, 0x08, 0xFF, 0x6B, 0x34, 0x08, 0xFF, 0x66, 0x32, 0x06, 0xFF, 0x65, 0x32, + 0x06, 0xFF, 0x6B, 0x36, 0x08, 0xFF, 0x75, 0x3C, 0x0A, 0xFF, 0x7C, 0x3F, 0x0B, 0xFF, 0x80, 0x41, + 0x0B, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x82, 0x43, 0x0B, 0xFF, 0x83, 0x44, 0x0B, 0xFF, 0x83, 0x44, + 0x0B, 0xFF, 0x84, 0x45, 0x0C, 0xFF, 0x84, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, + 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, + 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x84, 0x44, 0x0B, 0xFF, 0x83, 0x44, + 0x0B, 0xFF, 0x84, 0x45, 0x0D, 0xFF, 0x86, 0x49, 0x12, 0xFF, 0x8B, 0x51, 0x1C, 0xFF, 0x90, 0x58, + 0x27, 0xFF, 0x92, 0x5C, 0x2D, 0xFF, 0x92, 0x5D, 0x2F, 0xFF, 0x91, 0x5C, 0x2F, 0xFF, 0x8F, 0x5C, + 0x2F, 0xFF, 0x8E, 0x5B, 0x30, 0xFF, 0x8C, 0x5A, 0x31, 0xFF, 0x8A, 0x58, 0x31, 0xFF, 0x89, 0x58, + 0x32, 0xFF, 0x8B, 0x5B, 0x38, 0xFF, 0x98, 0x6C, 0x4B, 0xFF, 0xAE, 0x89, 0x6C, 0xED, 0xBF, 0x9F, + 0x85, 0x62, 0xD1, 0xB1, 0x92, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xB2, 0x9C, 0x19, 0xAD, 0x88, + 0x69, 0xB4, 0x88, 0x57, 0x33, 0xFF, 0x6C, 0x34, 0x10, 0xFF, 0x65, 0x2B, 0x07, 0xFF, 0x66, 0x2C, + 0x06, 0xFF, 0x69, 0x2F, 0x07, 0xFF, 0x6D, 0x31, 0x07, 0xFF, 0x70, 0x34, 0x08, 0xFF, 0x6F, 0x35, + 0x08, 0xFF, 0x68, 0x33, 0x06, 0xFF, 0x60, 0x32, 0x08, 0xFF, 0x92, 0x74, 0x58, 0xFF, 0xA0, 0x89, + 0x71, 0xFF, 0x65, 0x3D, 0x14, 0xFF, 0x67, 0x36, 0x06, 0xFF, 0x77, 0x3F, 0x0A, 0xFF, 0x80, 0x43, + 0x0B, 0xFF, 0x84, 0x45, 0x0C, 0xFF, 0x86, 0x46, 0x0C, 0xFF, 0x86, 0x46, 0x0C, 0xFF, 0x87, 0x46, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x88, 0x47, 0x0C, 0xFF, 0x87, 0x47, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x47, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x88, 0x47, 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x47, + 0x0C, 0xFF, 0x86, 0x46, 0x0C, 0xFF, 0x86, 0x46, 0x0B, 0xFF, 0x85, 0x46, 0x0B, 0xFF, 0x87, 0x48, + 0x0F, 0xFF, 0x8B, 0x50, 0x18, 0xFF, 0x91, 0x58, 0x25, 0xFF, 0x94, 0x5E, 0x2E, 0xFF, 0x94, 0x5E, + 0x30, 0xFF, 0x92, 0x5D, 0x30, 0xFF, 0x90, 0x5C, 0x30, 0xFF, 0x8E, 0x5B, 0x30, 0xFF, 0x8D, 0x5A, + 0x31, 0xFF, 0x8B, 0x59, 0x32, 0xFF, 0x8D, 0x5D, 0x39, 0xFF, 0x9B, 0x6F, 0x4E, 0xFF, 0xB2, 0x8E, + 0x71, 0xE4, 0xC8, 0xAB, 0x93, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE4, 0xD4, 0xC1, 0x07, 0xB5, 0x92, 0x74, 0x8D, 0x90, 0x61, + 0x3C, 0xFE, 0x70, 0x39, 0x13, 0xFF, 0x67, 0x2D, 0x08, 0xFF, 0x68, 0x2D, 0x07, 0xFF, 0x6C, 0x30, + 0x07, 0xFF, 0x6F, 0x33, 0x08, 0xFF, 0x72, 0x36, 0x09, 0xFF, 0x71, 0x38, 0x09, 0xFF, 0x67, 0x32, + 0x05, 0xFF, 0x6C, 0x45, 0x1E, 0xFF, 0xA0, 0x8C, 0x77, 0xFF, 0xB8, 0xAE, 0xA1, 0xFF, 0xE4, 0xE2, + 0xDD, 0xFF, 0xC3, 0xB7, 0xA8, 0xFF, 0x74, 0x53, 0x2E, 0xFF, 0x66, 0x38, 0x06, 0xFF, 0x76, 0x40, + 0x0A, 0xFF, 0x81, 0x45, 0x0C, 0xFF, 0x86, 0x48, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, + 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, + 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, + 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, + 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x88, 0x48, 0x0D, 0xFF, 0x88, 0x48, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x88, 0x49, 0x0E, 0xFF, 0x8C, 0x50, 0x18, 0xFF, 0x92, 0x5A, + 0x26, 0xFF, 0x95, 0x5F, 0x2E, 0xFF, 0x94, 0x5F, 0x30, 0xFF, 0x92, 0x5E, 0x30, 0xFF, 0x91, 0x5D, + 0x30, 0xFF, 0x8F, 0x5B, 0x31, 0xFF, 0x8D, 0x5A, 0x32, 0xFF, 0x90, 0x60, 0x3A, 0xFF, 0xA0, 0x75, + 0x53, 0xFF, 0xB7, 0x95, 0x78, 0xCD, 0xD0, 0xB8, 0xA3, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBE, 0x9F, 0x83, 0x59, 0x9C, 0x70, 0x4C, 0xF1, 0x77, 0x40, + 0x19, 0xFF, 0x69, 0x2F, 0x09, 0xFF, 0x69, 0x2E, 0x07, 0xFF, 0x6D, 0x31, 0x07, 0xFF, 0x71, 0x34, + 0x08, 0xFF, 0x73, 0x38, 0x09, 0xFF, 0x73, 0x39, 0x09, 0xFF, 0x68, 0x34, 0x05, 0xFF, 0x70, 0x4A, + 0x24, 0xFF, 0xC3, 0xB7, 0xAA, 0xFF, 0xEB, 0xEB, 0xEA, 0xFF, 0xCD, 0xC9, 0xC1, 0xFF, 0x9D, 0x94, + 0x83, 0xFF, 0xD0, 0xCC, 0xC3, 0xFF, 0xDD, 0xD6, 0xCE, 0xFF, 0x8E, 0x74, 0x54, 0xFF, 0x68, 0x3C, + 0x0B, 0xFF, 0x74, 0x40, 0x0A, 0xFF, 0x80, 0x46, 0x0C, 0xFF, 0x87, 0x49, 0x0D, 0xFF, 0x8A, 0x4A, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4A, + 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x89, 0x4A, + 0x0F, 0xFF, 0x8E, 0x53, 0x1A, 0xFF, 0x94, 0x5D, 0x29, 0xFF, 0x96, 0x60, 0x2F, 0xFF, 0x94, 0x5F, + 0x30, 0xFF, 0x92, 0x5E, 0x30, 0xFF, 0x90, 0x5C, 0x30, 0xFF, 0x8E, 0x5C, 0x32, 0xFF, 0x94, 0x64, + 0x3E, 0xFF, 0xA7, 0x7F, 0x5C, 0xFF, 0xBE, 0x9F, 0x83, 0xA0, 0xD7, 0xC4, 0xB1, 0x0E, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xCC, 0xB0, 0x96, 0x23, 0xAA, 0x83, 0x61, 0xCB, 0x83, 0x4E, 0x26, 0xFF, 0x6D, 0x33, + 0x0C, 0xFF, 0x6A, 0x2F, 0x07, 0xFF, 0x6E, 0x32, 0x07, 0xFF, 0x73, 0x36, 0x08, 0xFF, 0x76, 0x39, + 0x09, 0xFF, 0x75, 0x3A, 0x09, 0xFF, 0x6B, 0x37, 0x06, 0xFF, 0x6F, 0x4A, 0x21, 0xFF, 0xC5, 0xBA, + 0xAD, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xD7, 0xD4, + 0xD0, 0xFF, 0x95, 0x8B, 0x78, 0xFF, 0xB2, 0xAA, 0x9C, 0xFF, 0xE6, 0xE3, 0xDD, 0xFF, 0xAB, 0x98, + 0x81, 0xFF, 0x6D, 0x46, 0x17, 0xFF, 0x70, 0x3E, 0x08, 0xFF, 0x7E, 0x46, 0x0C, 0xFF, 0x86, 0x49, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, + 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, + 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, + 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, + 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8B, 0x4A, + 0x0D, 0xFF, 0x8A, 0x4A, 0x0C, 0xFF, 0x8C, 0x4D, 0x11, 0xFF, 0x92, 0x57, 0x1F, 0xFF, 0x96, 0x60, + 0x2D, 0xFF, 0x96, 0x60, 0x2F, 0xFF, 0x94, 0x5F, 0x30, 0xFF, 0x91, 0x5D, 0x30, 0xFF, 0x91, 0x5E, + 0x34, 0xFF, 0x9A, 0x6C, 0x45, 0xFF, 0xB1, 0x8B, 0x6A, 0xF4, 0xC7, 0xA8, 0x8E, 0x61, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0xE2, + 0xD4, 0x04, 0xB9, 0x96, 0x77, 0x86, 0x94, 0x63, 0x3C, 0xFE, 0x73, 0x3A, 0x12, 0xFF, 0x6C, 0x31, + 0x08, 0xFF, 0x6F, 0x32, 0x08, 0xFF, 0x74, 0x36, 0x08, 0xFF, 0x77, 0x3A, 0x09, 0xFF, 0x78, 0x3C, + 0x0A, 0xFF, 0x70, 0x39, 0x08, 0xFF, 0x6D, 0x45, 0x1A, 0xFF, 0xC0, 0xB4, 0xA5, 0xFF, 0xEB, 0xEA, + 0xEB, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE5, 0xE4, 0xE4, 0xFF, 0xE4, 0xE3, 0xE3, 0xFF, 0xE8, 0xE7, + 0xE8, 0xFF, 0xE2, 0xE0, 0xDD, 0xFF, 0x9A, 0x90, 0x7F, 0xFF, 0x92, 0x86, 0x72, 0xFF, 0xDE, 0xDB, + 0xD6, 0xFF, 0xC5, 0xBA, 0xAB, 0xFF, 0x7A, 0x59, 0x2F, 0xFF, 0x6C, 0x3D, 0x08, 0xFF, 0x7B, 0x45, + 0x0C, 0xFF, 0x86, 0x4A, 0x0D, 0xFF, 0x8C, 0x4C, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, + 0x0E, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0E, 0xFF, 0x8F, 0x52, + 0x17, 0xFF, 0x96, 0x5D, 0x28, 0xFF, 0x97, 0x61, 0x30, 0xFF, 0x95, 0x60, 0x30, 0xFF, 0x92, 0x5E, + 0x30, 0xFF, 0x94, 0x62, 0x37, 0xFF, 0xA3, 0x77, 0x52, 0xFF, 0xBB, 0x99, 0x7A, 0xCC, 0xD1, 0xB7, + 0xA0, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC7, 0xA9, + 0x8D, 0x36, 0xA7, 0x7C, 0x58, 0xE1, 0x7F, 0x48, 0x1E, 0xFF, 0x6F, 0x34, 0x0A, 0xFF, 0x70, 0x33, + 0x07, 0xFF, 0x74, 0x36, 0x08, 0xFF, 0x79, 0x3B, 0x09, 0xFF, 0x7B, 0x3E, 0x0A, 0xFF, 0x74, 0x3C, + 0x08, 0xFF, 0x6B, 0x3F, 0x12, 0xFF, 0xB5, 0xA5, 0x93, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xE5, 0xE4, + 0xE4, 0xFF, 0xE7, 0xE6, 0xE6, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE7, 0xE7, + 0xE7, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE9, 0xE8, 0xE7, 0xFF, 0xA8, 0xA0, 0x91, 0xFF, 0x7C, 0x6D, + 0x56, 0xFF, 0xC9, 0xC3, 0xBA, 0xFF, 0xD9, 0xD3, 0xCC, 0xFF, 0x90, 0x76, 0x55, 0xFF, 0x6B, 0x40, + 0x0C, 0xFF, 0x77, 0x43, 0x0A, 0xFF, 0x85, 0x4A, 0x0D, 0xFF, 0x8C, 0x4D, 0x0E, 0xFF, 0x8F, 0x4F, + 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, + 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, + 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, + 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, + 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8E, 0x4E, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8D, 0x4C, + 0x0D, 0xFF, 0x8E, 0x4F, 0x12, 0xFF, 0x94, 0x5A, 0x22, 0xFF, 0x98, 0x61, 0x2E, 0xFF, 0x95, 0x60, + 0x2F, 0xFF, 0x94, 0x5F, 0x31, 0xFF, 0x9A, 0x69, 0x3F, 0xFF, 0xAF, 0x87, 0x63, 0xFD, 0xC5, 0xA8, + 0x8B, 0x7D, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0xEE, 0xE4, 0x06, 0xB9, 0x95, + 0x73, 0x94, 0x92, 0x60, 0x36, 0xFF, 0x76, 0x3B, 0x10, 0xFF, 0x71, 0x34, 0x08, 0xFF, 0x75, 0x37, + 0x08, 0xFF, 0x7A, 0x3B, 0x09, 0xFF, 0x7E, 0x3F, 0x0A, 0xFF, 0x7C, 0x40, 0x0A, 0xFF, 0x70, 0x3D, + 0x0B, 0xFF, 0xA7, 0x91, 0x77, 0xFF, 0xEA, 0xE9, 0xE8, 0xFF, 0xE5, 0xE4, 0xE4, 0xFF, 0xE6, 0xE5, + 0xE5, 0xFF, 0xE8, 0xE7, 0xE7, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, + 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xBA, 0xB3, + 0xAA, 0xFF, 0x72, 0x62, 0x48, 0xFF, 0xAB, 0xA2, 0x92, 0xFF, 0xDF, 0xDD, 0xD9, 0xFF, 0xA9, 0x97, + 0x80, 0xFF, 0x70, 0x4A, 0x19, 0xFF, 0x73, 0x41, 0x08, 0xFF, 0x82, 0x4A, 0x0D, 0xFF, 0x8B, 0x4E, + 0x0E, 0xFF, 0x90, 0x50, 0x0E, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x92, 0x50, 0x0F, 0xFF, 0x92, 0x50, + 0x0F, 0xFF, 0x92, 0x50, 0x0F, 0xFF, 0x92, 0x50, 0x0F, 0xFF, 0x92, 0x50, 0x0F, 0xFF, 0x92, 0x50, + 0x0F, 0xFF, 0x92, 0x50, 0x0F, 0xFF, 0x92, 0x50, 0x0F, 0xFF, 0x92, 0x50, 0x0F, 0xFF, 0x92, 0x50, + 0x0F, 0xFF, 0x92, 0x50, 0x0F, 0xFF, 0x92, 0x50, 0x0F, 0xFF, 0x92, 0x50, 0x0F, 0xFF, 0x92, 0x50, + 0x0F, 0xFF, 0x92, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x90, 0x4F, + 0x0E, 0xFF, 0x8F, 0x4E, 0x0D, 0xFF, 0x8E, 0x4D, 0x0F, 0xFF, 0x93, 0x56, 0x1C, 0xFF, 0x98, 0x61, + 0x2C, 0xFF, 0x97, 0x61, 0x2F, 0xFF, 0x97, 0x62, 0x34, 0xFF, 0xA4, 0x76, 0x4D, 0xFF, 0xBC, 0x99, + 0x79, 0xD7, 0xD3, 0xB9, 0xA1, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD0, 0xB4, 0x9A, 0x30, 0xA9, 0x7F, + 0x58, 0xE0, 0x83, 0x4A, 0x1E, 0xFF, 0x74, 0x37, 0x0A, 0xFF, 0x75, 0x37, 0x08, 0xFF, 0x7A, 0x3B, + 0x09, 0xFF, 0x7E, 0x3F, 0x0A, 0xFF, 0x82, 0x43, 0x0B, 0xFF, 0x7C, 0x42, 0x09, 0xFF, 0x9F, 0x7E, + 0x5B, 0xFF, 0xE9, 0xE6, 0xE3, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE7, 0xE7, 0xE6, 0xFF, 0xE7, 0xE7, + 0xE6, 0xFF, 0xE8, 0xE8, 0xE7, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xED, 0xED, + 0xEC, 0xFF, 0xED, 0xED, 0xEC, 0xFF, 0xED, 0xED, 0xEC, 0xFF, 0xED, 0xED, 0xEC, 0xFF, 0xF0, 0xF0, + 0xF0, 0xFF, 0xCB, 0xC7, 0xBE, 0xFF, 0x75, 0x65, 0x49, 0xFF, 0x8E, 0x80, 0x6A, 0xFF, 0xD9, 0xD7, + 0xD3, 0xFF, 0xC0, 0xB6, 0xA8, 0xFF, 0x7C, 0x5C, 0x31, 0xFF, 0x6F, 0x41, 0x09, 0xFF, 0x7E, 0x49, + 0x0D, 0xFF, 0x8A, 0x4E, 0x0E, 0xFF, 0x90, 0x51, 0x0F, 0xFF, 0x92, 0x52, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x92, 0x54, + 0x18, 0xFF, 0x97, 0x60, 0x2A, 0xFF, 0x98, 0x62, 0x30, 0xFF, 0x9D, 0x6A, 0x3D, 0xFF, 0xB2, 0x8A, + 0x64, 0xFE, 0xCA, 0xAB, 0x8E, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC1, 0x9F, 0x80, 0x7C, 0x99, 0x67, + 0x3C, 0xFE, 0x7C, 0x3F, 0x12, 0xFF, 0x76, 0x38, 0x09, 0xFF, 0x7A, 0x3B, 0x09, 0xFF, 0x7E, 0x3F, + 0x0A, 0xFF, 0x83, 0x44, 0x0B, 0xFF, 0x86, 0x47, 0x0C, 0xFF, 0x82, 0x46, 0x0B, 0xFF, 0xBA, 0x9F, + 0x81, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, + 0xEA, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xD7, 0xD5, 0xD1, 0xFF, 0x82, 0x74, 0x5C, 0xFF, 0x77, 0x66, + 0x49, 0xFF, 0xCB, 0xC5, 0xBD, 0xFF, 0xD4, 0xCF, 0xC9, 0xFF, 0x90, 0x78, 0x55, 0xFF, 0x6F, 0x45, + 0x0F, 0xFF, 0x7B, 0x48, 0x0C, 0xFF, 0x89, 0x4F, 0x0F, 0xFF, 0x91, 0x53, 0x10, 0xFF, 0x94, 0x54, + 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, + 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x95, 0x53, 0x0F, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x8F, 0x4F, + 0x0E, 0xFF, 0x91, 0x53, 0x15, 0xFF, 0x98, 0x5F, 0x28, 0xFF, 0x9B, 0x65, 0x33, 0xFF, 0xA9, 0x7B, + 0x50, 0xFF, 0xC2, 0xA0, 0x7E, 0xC6, 0xDA, 0xC3, 0xAC, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0xD8, 0xC9, 0x16, 0xB4, 0x8C, 0x67, 0xC4, 0x8C, 0x55, + 0x26, 0xFF, 0x7A, 0x3B, 0x0C, 0xFF, 0x7A, 0x3B, 0x09, 0xFF, 0x7F, 0x3F, 0x0A, 0xFF, 0x83, 0x43, + 0x0B, 0xFF, 0x88, 0x47, 0x0C, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, 0x0C, 0xFF, 0x8C, 0x58, + 0x20, 0xFF, 0xD3, 0xC3, 0xB0, 0xFF, 0xF1, 0xF1, 0xF2, 0xFF, 0xED, 0xEC, 0xEC, 0xFF, 0xED, 0xED, + 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, 0xEB, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xF0, 0xF0, 0xEF, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xF0, 0xF0, + 0xEF, 0xFF, 0xF0, 0xF0, 0xEF, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xE2, 0xE2, 0xDF, 0xFF, 0x94, 0x88, + 0x73, 0xFF, 0x6B, 0x58, 0x35, 0xFF, 0xB7, 0xAE, 0xA0, 0xFF, 0xE0, 0xDE, 0xDC, 0xFF, 0xA9, 0x99, + 0x82, 0xFF, 0x74, 0x4F, 0x1E, 0xFF, 0x77, 0x47, 0x0C, 0xFF, 0x87, 0x50, 0x11, 0xFF, 0x91, 0x55, + 0x12, 0xFF, 0x96, 0x57, 0x13, 0xFF, 0x97, 0x57, 0x13, 0xFF, 0x98, 0x57, 0x13, 0xFF, 0x97, 0x57, + 0x13, 0xFF, 0x97, 0x57, 0x13, 0xFF, 0x97, 0x57, 0x13, 0xFF, 0x97, 0x57, 0x12, 0xFF, 0x97, 0x56, + 0x12, 0xFF, 0x97, 0x56, 0x11, 0xFF, 0x97, 0x55, 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x96, 0x55, + 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x96, 0x55, + 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x53, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x92, 0x53, 0x15, 0xFF, 0x98, 0x60, 0x29, 0xFF, 0xA3, 0x70, + 0x41, 0xFF, 0xBA, 0x94, 0x6E, 0xF2, 0xD1, 0xB4, 0x98, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0xB2, 0x95, 0x45, 0xA8, 0x7A, 0x50, 0xF0, 0x84, 0x48, + 0x18, 0xFF, 0x7B, 0x3C, 0x0A, 0xFF, 0x7E, 0x3E, 0x0A, 0xFF, 0x84, 0x43, 0x0B, 0xFF, 0x88, 0x47, + 0x0C, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x8C, 0x4E, + 0x0B, 0xFF, 0x98, 0x6A, 0x36, 0xFF, 0xE2, 0xDA, 0xCF, 0xFF, 0xF0, 0xF1, 0xF2, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF1, 0xF1, + 0xF1, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF2, 0xF1, 0xF1, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xEC, 0xEC, + 0xEB, 0xFF, 0xA8, 0xA0, 0x90, 0xFF, 0x68, 0x54, 0x32, 0xFF, 0xA0, 0x93, 0x7D, 0xFF, 0xE2, 0xE1, + 0xDF, 0xFF, 0xC3, 0xBB, 0xAD, 0xFF, 0x81, 0x63, 0x38, 0xFF, 0x74, 0x47, 0x0E, 0xFF, 0x85, 0x50, + 0x12, 0xFF, 0x91, 0x56, 0x13, 0xFF, 0x98, 0x59, 0x13, 0xFF, 0x9A, 0x5A, 0x13, 0xFF, 0x9A, 0x5A, + 0x13, 0xFF, 0x9A, 0x5A, 0x13, 0xFF, 0x9A, 0x5A, 0x13, 0xFF, 0x9A, 0x5A, 0x13, 0xFF, 0x9A, 0x5A, + 0x13, 0xFF, 0x9A, 0x5A, 0x13, 0xFF, 0x9A, 0x5A, 0x13, 0xFF, 0x9A, 0x59, 0x13, 0xFF, 0x99, 0x58, + 0x11, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x98, 0x57, + 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x96, 0x55, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x92, 0x50, 0x0E, 0xFF, 0x92, 0x53, 0x14, 0xFF, 0x9E, 0x66, + 0x31, 0xFF, 0xB3, 0x88, 0x5D, 0xFF, 0xCB, 0xAB, 0x8B, 0x91, 0xF9, 0xEF, 0xE2, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0xA3, 0x82, 0x80, 0x9C, 0x68, 0x3B, 0xFF, 0x81, 0x43, + 0x11, 0xFF, 0x7E, 0x3E, 0x0A, 0xFF, 0x83, 0x42, 0x0B, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x8C, 0x4B, + 0x0D, 0xFF, 0x90, 0x4E, 0x0E, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x96, 0x55, + 0x10, 0xFF, 0x8D, 0x50, 0x0C, 0xFF, 0xA8, 0x83, 0x56, 0xFF, 0xEC, 0xE8, 0xE3, 0xFF, 0xEF, 0xEF, + 0xF0, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xF1, 0xF1, + 0xF1, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF3, 0xF3, + 0xF3, 0xFF, 0xF1, 0xF1, 0xF2, 0xFF, 0xBD, 0xB7, 0xAC, 0xFF, 0x6F, 0x5C, 0x38, 0xFF, 0x8A, 0x79, + 0x5C, 0xFF, 0xDB, 0xD8, 0xD3, 0xFF, 0xD9, 0xD5, 0xCF, 0xFF, 0x94, 0x7E, 0x5C, 0xFF, 0x74, 0x4C, + 0x15, 0xFF, 0x81, 0x50, 0x13, 0xFF, 0x90, 0x58, 0x15, 0xFF, 0x99, 0x5B, 0x16, 0xFF, 0x9C, 0x5D, + 0x16, 0xFF, 0x9D, 0x5D, 0x16, 0xFF, 0x9D, 0x5D, 0x16, 0xFF, 0x9D, 0x5D, 0x16, 0xFF, 0x9D, 0x5D, + 0x16, 0xFF, 0x9D, 0x5D, 0x16, 0xFF, 0x9D, 0x5D, 0x16, 0xFF, 0x9D, 0x5D, 0x16, 0xFF, 0x9D, 0x5D, + 0x16, 0xFF, 0x9C, 0x5C, 0x15, 0xFF, 0x9B, 0x5A, 0x13, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x9A, 0x58, + 0x11, 0xFF, 0x9A, 0x58, 0x11, 0xFF, 0x9A, 0x58, 0x11, 0xFF, 0x99, 0x58, 0x11, 0xFF, 0x98, 0x57, + 0x10, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x95, 0x58, + 0x1B, 0xFF, 0xAB, 0x7A, 0x4B, 0xFF, 0xC5, 0xA3, 0x80, 0xCB, 0xBA, 0xA6, 0x90, 0x18, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF0, 0xE5, 0xD6, 0x0B, 0xBA, 0x93, 0x6C, 0xB8, 0x94, 0x5C, 0x2B, 0xFF, 0x81, 0x41, + 0x0D, 0xFF, 0x82, 0x41, 0x0A, 0xFF, 0x87, 0x46, 0x0C, 0xFF, 0x8B, 0x4A, 0x0D, 0xFF, 0x90, 0x4E, + 0x0E, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x99, 0x57, 0x10, 0xFF, 0x9A, 0x5A, + 0x13, 0xFF, 0x9A, 0x5C, 0x15, 0xFF, 0x92, 0x5A, 0x16, 0xFF, 0xBC, 0xA1, 0x7F, 0xFF, 0xEE, 0xEE, + 0xED, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF1, 0xF1, + 0xF1, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF2, 0xF2, 0xF3, 0xFF, 0xD0, 0xCC, 0xC4, 0xFF, 0x7D, 0x6D, + 0x4C, 0xFF, 0x7A, 0x67, 0x43, 0xFF, 0xCE, 0xC8, 0xBE, 0xFF, 0xE5, 0xE4, 0xE3, 0xFF, 0xAB, 0x9D, + 0x85, 0xFF, 0x7A, 0x57, 0x24, 0xFF, 0x7E, 0x50, 0x13, 0xFF, 0x8F, 0x59, 0x17, 0xFF, 0x99, 0x5E, + 0x18, 0xFF, 0x9E, 0x60, 0x19, 0xFF, 0x9F, 0x60, 0x19, 0xFF, 0x9F, 0x60, 0x19, 0xFF, 0x9F, 0x60, + 0x19, 0xFF, 0x9F, 0x60, 0x19, 0xFF, 0x9F, 0x60, 0x19, 0xFF, 0x9F, 0x60, 0x19, 0xFF, 0x9F, 0x60, + 0x19, 0xFF, 0x9F, 0x60, 0x19, 0xFF, 0x9F, 0x60, 0x19, 0xFF, 0x9F, 0x5F, 0x17, 0xFF, 0x9D, 0x5D, + 0x14, 0xFF, 0x9C, 0x5B, 0x12, 0xFF, 0x9B, 0x5A, 0x11, 0xFF, 0x9B, 0x5A, 0x11, 0xFF, 0x9B, 0x5A, + 0x11, 0xFF, 0x9A, 0x58, 0x11, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x96, 0x54, 0x0F, 0xFF, 0x93, 0x52, + 0x10, 0xFF, 0xA1, 0x6A, 0x31, 0xFF, 0xBF, 0x99, 0x71, 0xEC, 0xAF, 0x9A, 0x82, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xE1, 0xCD, 0xB7, 0x27, 0xB4, 0x88, 0x5D, 0xDB, 0x8F, 0x54, 0x20, 0xFF, 0x82, 0x42, + 0x0C, 0xFF, 0x86, 0x45, 0x0B, 0xFF, 0x8B, 0x49, 0x0C, 0xFF, 0x90, 0x4E, 0x0E, 0xFF, 0x93, 0x52, + 0x0E, 0xFF, 0x97, 0x55, 0x0F, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x9E, 0x5D, 0x15, 0xFF, 0xA1, 0x62, + 0x1A, 0xFF, 0xA1, 0x63, 0x1C, 0xFF, 0x9D, 0x60, 0x1A, 0xFF, 0x97, 0x62, 0x22, 0xFF, 0xCB, 0xB8, + 0xA1, 0xFF, 0xEC, 0xED, 0xEE, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, + 0xE9, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, + 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xF0, 0xF0, 0xF1, 0xFF, 0xDD, 0xDB, + 0xD7, 0xFF, 0x90, 0x82, 0x66, 0xFF, 0x71, 0x5D, 0x35, 0xFF, 0xBD, 0xB4, 0xA4, 0xFF, 0xEA, 0xEA, + 0xEA, 0xFF, 0xC3, 0xBA, 0xAC, 0xFF, 0x85, 0x68, 0x3C, 0xFF, 0x7B, 0x50, 0x15, 0xFF, 0x8D, 0x59, + 0x19, 0xFF, 0x99, 0x5F, 0x1B, 0xFF, 0x9F, 0x62, 0x1C, 0xFF, 0xA1, 0x63, 0x1C, 0xFF, 0xA2, 0x63, + 0x1C, 0xFF, 0xA2, 0x63, 0x1C, 0xFF, 0xA2, 0x63, 0x1C, 0xFF, 0xA2, 0x63, 0x1C, 0xFF, 0xA2, 0x63, + 0x1C, 0xFF, 0xA2, 0x63, 0x1C, 0xFF, 0xA2, 0x63, 0x1C, 0xFF, 0xA2, 0x63, 0x1C, 0xFF, 0xA2, 0x63, + 0x1B, 0xFF, 0xA1, 0x62, 0x19, 0xFF, 0x9F, 0x5E, 0x14, 0xFF, 0x9D, 0x5C, 0x12, 0xFF, 0x9D, 0x5B, + 0x11, 0xFF, 0x9C, 0x5A, 0x11, 0xFF, 0x9B, 0x59, 0x11, 0xFF, 0x99, 0x57, 0x10, 0xFF, 0x96, 0x54, + 0x10, 0xFF, 0x9B, 0x5E, 0x1F, 0xFF, 0xB7, 0x8B, 0x5D, 0xFB, 0xD0, 0xB3, 0x94, 0x6B, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xD3, 0xB5, 0x97, 0x45, 0xAE, 0x7F, 0x51, 0xEF, 0x8D, 0x4F, 0x19, 0xFF, 0x85, 0x43, + 0x0B, 0xFF, 0x8A, 0x47, 0x0C, 0xFF, 0x8F, 0x4D, 0x0D, 0xFF, 0x93, 0x51, 0x0E, 0xFF, 0x97, 0x55, + 0x0F, 0xFF, 0x9C, 0x5B, 0x13, 0xFF, 0xA1, 0x61, 0x1A, 0xFF, 0xA4, 0x65, 0x1E, 0xFF, 0xA4, 0x66, + 0x1E, 0xFF, 0xA5, 0x66, 0x1E, 0xFF, 0xA4, 0x66, 0x1E, 0xFF, 0x9E, 0x62, 0x1B, 0xFF, 0x9D, 0x6F, + 0x34, 0xFF, 0xD5, 0xCA, 0xBA, 0xFF, 0xE8, 0xE9, 0xEA, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE5, 0xE5, + 0xE5, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE7, 0xE7, + 0xE7, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xEA, 0xEA, + 0xEA, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xED, 0xED, + 0xEE, 0xFF, 0xE6, 0xE5, 0xE4, 0xFF, 0xA5, 0x9A, 0x85, 0xFF, 0x6F, 0x5A, 0x30, 0xFF, 0xA9, 0x9D, + 0x86, 0xFF, 0xE7, 0xE6, 0xE6, 0xFF, 0xD6, 0xD2, 0xCC, 0xFF, 0x96, 0x80, 0x5E, 0xFF, 0x7A, 0x54, + 0x1C, 0xFF, 0x89, 0x59, 0x1A, 0xFF, 0x99, 0x61, 0x1D, 0xFF, 0xA1, 0x65, 0x1E, 0xFF, 0xA4, 0x66, + 0x1E, 0xFF, 0xA5, 0x66, 0x1E, 0xFF, 0xA5, 0x66, 0x1E, 0xFF, 0xA5, 0x66, 0x1E, 0xFF, 0xA5, 0x66, + 0x1E, 0xFF, 0xA5, 0x66, 0x1E, 0xFF, 0xA5, 0x66, 0x1E, 0xFF, 0xA5, 0x66, 0x1E, 0xFF, 0xA5, 0x66, + 0x1E, 0xFF, 0xA5, 0x66, 0x1E, 0xFF, 0xA5, 0x66, 0x1E, 0xFF, 0xA3, 0x63, 0x1A, 0xFF, 0xA0, 0x5F, + 0x13, 0xFF, 0x9E, 0x5C, 0x12, 0xFF, 0x9D, 0x5B, 0x11, 0xFF, 0x9C, 0x5A, 0x11, 0xFF, 0x99, 0x57, + 0x10, 0xFF, 0x9A, 0x5B, 0x18, 0xFF, 0xB0, 0x7E, 0x49, 0xFF, 0xCF, 0xAE, 0x8C, 0x94, 0xFF, 0xFF, + 0xFF, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xCC, 0xAA, 0x88, 0x64, 0xA9, 0x77, 0x47, 0xFC, 0x8D, 0x4D, 0x15, 0xFF, 0x89, 0x46, + 0x0B, 0xFF, 0x8E, 0x4B, 0x0D, 0xFF, 0x92, 0x50, 0x0E, 0xFF, 0x97, 0x55, 0x10, 0xFF, 0x9E, 0x5E, + 0x17, 0xFF, 0xA3, 0x65, 0x1F, 0xFF, 0xA6, 0x68, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA8, 0x6A, + 0x21, 0xFF, 0xA8, 0x6A, 0x21, 0xFF, 0xA8, 0x6A, 0x21, 0xFF, 0xA7, 0x6A, 0x21, 0xFF, 0x9E, 0x64, + 0x1D, 0xFF, 0xA6, 0x7F, 0x4B, 0xFF, 0xDA, 0xD4, 0xCC, 0xFF, 0xE3, 0xE4, 0xE5, 0xFF, 0xE2, 0xE2, + 0xE2, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xE1, 0xE2, + 0xE2, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE2, 0xE2, + 0xE2, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE7, 0xE8, 0xE8, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, + 0xE9, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xB8, 0xB1, 0xA1, 0xFF, 0x74, 0x60, + 0x37, 0xFF, 0x97, 0x86, 0x68, 0xFF, 0xDE, 0xDC, 0xD8, 0xFF, 0xE2, 0xE1, 0xE0, 0xFF, 0xAB, 0x9D, + 0x84, 0xFF, 0x7F, 0x5E, 0x2B, 0xFF, 0x86, 0x59, 0x1B, 0xFF, 0x98, 0x63, 0x20, 0xFF, 0xA2, 0x67, + 0x21, 0xFF, 0xA6, 0x69, 0x21, 0xFF, 0xA8, 0x6A, 0x21, 0xFF, 0xA8, 0x6A, 0x21, 0xFF, 0xA8, 0x6A, + 0x21, 0xFF, 0xA8, 0x6A, 0x21, 0xFF, 0xA8, 0x6A, 0x21, 0xFF, 0xA8, 0x6A, 0x21, 0xFF, 0xA8, 0x6A, + 0x21, 0xFF, 0xA8, 0x6A, 0x21, 0xFF, 0xA8, 0x6A, 0x21, 0xFF, 0xA8, 0x6A, 0x21, 0xFF, 0xA7, 0x69, + 0x1E, 0xFF, 0xA3, 0x62, 0x16, 0xFF, 0xA0, 0x5E, 0x12, 0xFF, 0x9E, 0x5C, 0x11, 0xFF, 0x9C, 0x5A, + 0x10, 0xFF, 0x9C, 0x5C, 0x15, 0xFF, 0xAD, 0x77, 0x3E, 0xFF, 0xCC, 0xAA, 0x85, 0xB4, 0xF3, 0xEC, + 0xE1, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0x01, 0xCA, 0xA5, 0x81, 0x80, 0xA7, 0x71, 0x3D, 0xFF, 0x8E, 0x4D, 0x13, 0xFF, 0x8C, 0x49, + 0x0C, 0xFF, 0x92, 0x4F, 0x0D, 0xFF, 0x97, 0x55, 0x11, 0xFF, 0x9F, 0x60, 0x1B, 0xFF, 0xA5, 0x68, + 0x23, 0xFF, 0xA8, 0x6A, 0x24, 0xFF, 0xA9, 0x6C, 0x24, 0xFF, 0xAA, 0x6D, 0x25, 0xFF, 0xAB, 0x6E, + 0x25, 0xFF, 0xAB, 0x6E, 0x25, 0xFF, 0xAB, 0x6E, 0x25, 0xFF, 0xAB, 0x6E, 0x25, 0xFF, 0xA9, 0x6D, + 0x24, 0xFF, 0x9F, 0x67, 0x21, 0xFF, 0xB0, 0x90, 0x66, 0xFF, 0xDC, 0xDA, 0xD7, 0xFF, 0xDF, 0xDF, + 0xE0, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xDD, 0xDE, + 0xDE, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xE0, 0xE0, + 0xE1, 0xFF, 0xE2, 0xE2, 0xE3, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE5, 0xE5, + 0xE5, 0xFF, 0xE5, 0xE6, 0xE5, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE9, 0xE9, 0xEA, 0xFF, 0xCA, 0xC4, + 0xBA, 0xFF, 0x7F, 0x6D, 0x47, 0xFF, 0x88, 0x75, 0x51, 0xFF, 0xD2, 0xCD, 0xC4, 0xFF, 0xE6, 0xE7, + 0xE7, 0xFF, 0xC0, 0xB7, 0xA8, 0xFF, 0x89, 0x6E, 0x42, 0xFF, 0x83, 0x5A, 0x1E, 0xFF, 0x96, 0x64, + 0x22, 0xFF, 0xA2, 0x6A, 0x24, 0xFF, 0xA9, 0x6D, 0x24, 0xFF, 0xAB, 0x6E, 0x25, 0xFF, 0xAB, 0x6E, + 0x25, 0xFF, 0xAB, 0x6E, 0x25, 0xFF, 0xAB, 0x6E, 0x25, 0xFF, 0xAB, 0x6E, 0x25, 0xFF, 0xAB, 0x6E, + 0x25, 0xFF, 0xAB, 0x6E, 0x25, 0xFF, 0xAB, 0x6E, 0x25, 0xFF, 0xAB, 0x6E, 0x25, 0xFF, 0xAB, 0x6E, + 0x25, 0xFF, 0xAA, 0x6D, 0x23, 0xFF, 0xA6, 0x66, 0x1B, 0xFF, 0xA2, 0x5F, 0x13, 0xFF, 0x9F, 0x5C, + 0x11, 0xFF, 0x9F, 0x5D, 0x14, 0xFF, 0xAC, 0x74, 0x36, 0xFF, 0xCA, 0xA4, 0x7B, 0xCB, 0xE3, 0xCF, + 0xB6, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0x05, 0xCB, 0xA7, 0x81, 0x95, 0xA5, 0x6D, 0x37, 0xFF, 0x90, 0x4E, 0x12, 0xFF, 0x90, 0x4C, + 0x0C, 0xFF, 0x96, 0x54, 0x11, 0xFF, 0xA0, 0x62, 0x1F, 0xFF, 0xA6, 0x69, 0x25, 0xFF, 0xA9, 0x6C, + 0x26, 0xFF, 0xAB, 0x6E, 0x27, 0xFF, 0xAD, 0x70, 0x27, 0xFF, 0xAE, 0x71, 0x27, 0xFF, 0xAE, 0x71, + 0x27, 0xFF, 0xAE, 0x71, 0x27, 0xFF, 0xAE, 0x71, 0x27, 0xFF, 0xAE, 0x71, 0x27, 0xFF, 0xAD, 0x71, + 0x27, 0xFF, 0xAA, 0x6F, 0x26, 0xFF, 0xA0, 0x6C, 0x28, 0xFF, 0xBA, 0xA2, 0x81, 0xFF, 0xDB, 0xDB, + 0xDB, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDA, 0xDA, + 0xDA, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDC, 0xDC, 0xDD, 0xFF, 0xD2, 0xCD, + 0xC4, 0xFF, 0xB2, 0xA3, 0x89, 0xFF, 0xCB, 0xC0, 0xAF, 0xFF, 0xE2, 0xE1, 0xE1, 0xFF, 0xDF, 0xDF, + 0xDF, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE7, 0xE7, + 0xE7, 0xFF, 0xD5, 0xD3, 0xCD, 0xFF, 0x8E, 0x7F, 0x5E, 0xFF, 0x81, 0x6D, 0x45, 0xFF, 0xC4, 0xBD, + 0xB0, 0xFF, 0xE5, 0xE5, 0xE6, 0xFF, 0xD0, 0xCB, 0xC3, 0xFF, 0x98, 0x83, 0x5F, 0xFF, 0x82, 0x5D, + 0x23, 0xFF, 0x93, 0x64, 0x23, 0xFF, 0xA2, 0x6C, 0x27, 0xFF, 0xAA, 0x6F, 0x27, 0xFF, 0xAD, 0x71, + 0x27, 0xFF, 0xAE, 0x71, 0x27, 0xFF, 0xAE, 0x71, 0x27, 0xFF, 0xAE, 0x71, 0x27, 0xFF, 0xAE, 0x71, + 0x27, 0xFF, 0xAE, 0x71, 0x27, 0xFF, 0xAE, 0x71, 0x27, 0xFF, 0xAE, 0x71, 0x27, 0xFF, 0xAE, 0x71, + 0x27, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAD, 0x70, 0x27, 0xFF, 0xA8, 0x69, 0x1E, 0xFF, 0xA2, 0x60, + 0x13, 0xFF, 0xA0, 0x5E, 0x13, 0xFF, 0xAB, 0x72, 0x31, 0xFF, 0xC9, 0xA1, 0x76, 0xDB, 0xE2, 0xCE, + 0xB5, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0x08, 0xCB, 0xA6, 0x80, 0xA3, 0xA5, 0x6B, 0x33, 0xFF, 0x92, 0x4F, 0x11, 0xFF, 0x95, 0x52, + 0x12, 0xFF, 0xA1, 0x62, 0x21, 0xFF, 0xA7, 0x6A, 0x28, 0xFF, 0xAA, 0x6D, 0x29, 0xFF, 0xAC, 0x70, + 0x2A, 0xFF, 0xAE, 0x72, 0x2A, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB0, 0x74, + 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB0, 0x74, + 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xAB, 0x71, 0x29, 0xFF, 0xA3, 0x71, 0x31, 0xFF, 0xC1, 0xB0, + 0x98, 0xFF, 0xD8, 0xD8, 0xD9, 0xFF, 0xD6, 0xD6, 0xD6, 0xFF, 0xD7, 0xD7, 0xD7, 0xFF, 0xD8, 0xD8, + 0xD8, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, 0xDA, 0xDB, 0xDB, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xA3, 0x96, + 0x7B, 0xFF, 0x7F, 0x62, 0x30, 0xFF, 0x99, 0x7F, 0x53, 0xFF, 0xDF, 0xDB, 0xD5, 0xFF, 0xDC, 0xDD, + 0xDE, 0xFF, 0xDD, 0xDD, 0xDE, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE1, 0xE1, + 0xE1, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xDD, 0xDC, 0xD9, 0xFF, 0xA2, 0x97, 0x7E, 0xFF, 0x82, 0x70, + 0x48, 0xFF, 0xB9, 0xB0, 0x9E, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xDA, 0xD8, 0xD6, 0xFF, 0xAA, 0x9C, + 0x81, 0xFF, 0x85, 0x64, 0x2F, 0xFF, 0x90, 0x64, 0x25, 0xFF, 0xA2, 0x6E, 0x2A, 0xFF, 0xAB, 0x72, + 0x2A, 0xFF, 0xAF, 0x74, 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB0, 0x74, + 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB0, 0x74, + 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xAF, 0x73, 0x2B, 0xFF, 0xAA, 0x6B, + 0x20, 0xFF, 0xA3, 0x61, 0x14, 0xFF, 0xAC, 0x71, 0x2E, 0xFF, 0xC9, 0xA0, 0x73, 0xE6, 0xE3, 0xCF, + 0xB6, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFB, + 0xF6, 0x09, 0xCC, 0xA7, 0x80, 0xAB, 0xA5, 0x6B, 0x31, 0xFF, 0x96, 0x54, 0x15, 0xFF, 0xA0, 0x61, + 0x23, 0xFF, 0xA7, 0x6B, 0x2B, 0xFF, 0xAA, 0x6E, 0x2B, 0xFF, 0xAD, 0x71, 0x2C, 0xFF, 0xAF, 0x74, + 0x2D, 0xFF, 0xB1, 0x76, 0x2D, 0xFF, 0xB3, 0x77, 0x2E, 0xFF, 0xB3, 0x78, 0x2E, 0xFF, 0xB3, 0x78, + 0x2E, 0xFF, 0xB3, 0x78, 0x2E, 0xFF, 0xB3, 0x78, 0x2E, 0xFF, 0xB3, 0x78, 0x2E, 0xFF, 0xB3, 0x78, + 0x2E, 0xFF, 0xB3, 0x78, 0x2E, 0xFF, 0xB2, 0x78, 0x2E, 0xFF, 0xAC, 0x73, 0x2B, 0xFF, 0xA7, 0x7A, + 0x3E, 0xFF, 0xC8, 0xBC, 0xAD, 0xFF, 0xD6, 0xD7, 0xD8, 0xFF, 0xD7, 0xD6, 0xD7, 0xFF, 0xD7, 0xD7, + 0xD7, 0xFF, 0xD8, 0xD8, 0xD8, 0xFF, 0xD8, 0xD8, 0xD8, 0xFF, 0xDB, 0xDC, 0xDC, 0xFF, 0xB6, 0xAF, + 0x9E, 0xFF, 0x8B, 0x78, 0x50, 0xFF, 0x98, 0x83, 0x5B, 0xFF, 0xD5, 0xCD, 0xBF, 0xFF, 0xE1, 0xDF, + 0xDB, 0xFF, 0xD9, 0xD6, 0xCE, 0xFF, 0xDA, 0xD7, 0xD0, 0xFF, 0xE3, 0xE2, 0xE0, 0xFF, 0xE6, 0xE6, + 0xE7, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE2, 0xE2, 0xE3, 0xFF, 0xE1, 0xE1, 0xE0, 0xFF, 0xB5, 0xAD, + 0x9A, 0xFF, 0x89, 0x77, 0x52, 0xFF, 0xB0, 0xA5, 0x8F, 0xFF, 0xDD, 0xDC, 0xDB, 0xFF, 0xDF, 0xDF, + 0xDF, 0xFF, 0xBC, 0xB3, 0xA2, 0xFF, 0x8C, 0x72, 0x43, 0xFF, 0x8C, 0x64, 0x27, 0xFF, 0xA1, 0x6F, + 0x2C, 0xFF, 0xAC, 0x75, 0x2D, 0xFF, 0xB1, 0x77, 0x2E, 0xFF, 0xB3, 0x78, 0x2E, 0xFF, 0xB3, 0x78, + 0x2E, 0xFF, 0xB3, 0x78, 0x2E, 0xFF, 0xB3, 0x78, 0x2E, 0xFF, 0xB3, 0x78, 0x2E, 0xFF, 0xB3, 0x78, + 0x2E, 0xFF, 0xB3, 0x78, 0x2E, 0xFF, 0xB3, 0x78, 0x2E, 0xFF, 0xB2, 0x77, 0x2E, 0xFF, 0xB1, 0x75, + 0x2D, 0xFF, 0xAB, 0x6C, 0x23, 0xFF, 0xAE, 0x73, 0x2E, 0xFF, 0xC9, 0xA0, 0x71, 0xEB, 0xE4, 0xCF, + 0xB6, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFA, + 0xF5, 0x09, 0xCD, 0xA8, 0x80, 0xAC, 0xA9, 0x70, 0x35, 0xFF, 0xA1, 0x63, 0x27, 0xFF, 0xA6, 0x6A, + 0x2D, 0xFF, 0xAA, 0x6F, 0x2E, 0xFF, 0xAE, 0x72, 0x2F, 0xFF, 0xB1, 0x75, 0x30, 0xFF, 0xB3, 0x78, + 0x30, 0xFF, 0xB4, 0x7A, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, + 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, + 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB5, 0x7B, 0x31, 0xFF, 0xAF, 0x7A, + 0x34, 0xFF, 0xB3, 0x91, 0x61, 0xFF, 0xD1, 0xCC, 0xC4, 0xFF, 0xD7, 0xD7, 0xD8, 0xFF, 0xD6, 0xD6, + 0xD6, 0xFF, 0xD6, 0xD6, 0xD6, 0xFF, 0xD6, 0xD6, 0xD6, 0xFF, 0xD6, 0xD6, 0xD6, 0xFF, 0xDA, 0xDA, + 0xD9, 0xFF, 0xD6, 0xD4, 0xCF, 0xFF, 0xC8, 0xBF, 0xAF, 0xFF, 0x9D, 0x8A, 0x64, 0xFF, 0xAE, 0x9C, + 0x7B, 0xFF, 0xBB, 0xAD, 0x93, 0xFF, 0xB1, 0xA3, 0x88, 0xFF, 0xB4, 0xA6, 0x8B, 0xFF, 0xBB, 0xAF, + 0x97, 0xFF, 0xD8, 0xD4, 0xCC, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE0, 0xE0, 0xE1, 0xFF, 0xE2, 0xE2, + 0xE3, 0xFF, 0xC3, 0xBE, 0xB1, 0xFF, 0x90, 0x81, 0x5D, 0xFF, 0xA9, 0x9D, 0x82, 0xFF, 0xDA, 0xD8, + 0xD6, 0xFF, 0xE0, 0xE1, 0xE3, 0xFF, 0xCD, 0xC9, 0xBE, 0xFF, 0x99, 0x84, 0x5D, 0xFF, 0x8C, 0x67, + 0x2C, 0xFF, 0xA0, 0x71, 0x2F, 0xFF, 0xAE, 0x78, 0x31, 0xFF, 0xB4, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, + 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, + 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB5, 0x7B, 0x31, 0xFF, 0xB4, 0x79, + 0x31, 0xFF, 0xB3, 0x78, 0x31, 0xFF, 0xB5, 0x7E, 0x3C, 0xFF, 0xCB, 0xA2, 0x72, 0xED, 0xE5, 0xD0, + 0xB6, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFD, 0x08, 0xD0, 0xAB, 0x83, 0xA6, 0xB3, 0x7D, 0x47, 0xFF, 0xA9, 0x6E, 0x33, 0xFF, 0xAA, 0x6E, + 0x30, 0xFF, 0xAE, 0x73, 0x32, 0xFF, 0xB1, 0x77, 0x33, 0xFF, 0xB4, 0x7A, 0x34, 0xFF, 0xB6, 0x7C, + 0x34, 0xFF, 0xB7, 0x7E, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, + 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, + 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xBD, 0x86, 0x40, 0xFF, 0xC0, 0x8E, + 0x4E, 0xFF, 0xB9, 0x8B, 0x4E, 0xFF, 0xBE, 0xA2, 0x7C, 0xFF, 0xD7, 0xD4, 0xD0, 0xFF, 0xD8, 0xD8, + 0xD9, 0xFF, 0xD8, 0xD8, 0xD8, 0xFF, 0xD9, 0xD9, 0xD9, 0xFF, 0xD8, 0xD8, 0xD8, 0xFF, 0xD8, 0xD8, + 0xD8, 0xFF, 0xD8, 0xD8, 0xD9, 0xFF, 0xE0, 0xE0, 0xE1, 0xFF, 0xB6, 0xAB, 0x91, 0xFF, 0xA7, 0x95, + 0x71, 0xFF, 0xE5, 0xE2, 0xDC, 0xFF, 0xE2, 0xE1, 0xDD, 0xFF, 0xA4, 0x94, 0x71, 0xFF, 0x85, 0x6F, + 0x41, 0xFF, 0xB6, 0xAC, 0x96, 0xFF, 0xE1, 0xE1, 0xE2, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xE0, 0xE0, + 0xE0, 0xFF, 0xE2, 0xE2, 0xE3, 0xFF, 0xCF, 0xCC, 0xC3, 0xFF, 0x9A, 0x8D, 0x6D, 0xFF, 0xA5, 0x98, + 0x7C, 0xFF, 0xD8, 0xD5, 0xD1, 0xFF, 0xE0, 0xE0, 0xE2, 0xFF, 0xD8, 0xD6, 0xD1, 0xFF, 0xA8, 0x97, + 0x76, 0xFF, 0x90, 0x6C, 0x32, 0xFF, 0xA4, 0x75, 0x32, 0xFF, 0xB3, 0x7C, 0x34, 0xFF, 0xB8, 0x7F, + 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, + 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB8, 0x7F, 0x35, 0xFF, 0xB7, 0x7D, + 0x34, 0xFF, 0xB6, 0x7D, 0x36, 0xFF, 0xBD, 0x89, 0x4B, 0xFF, 0xD0, 0xAA, 0x7D, 0xE8, 0xE5, 0xD0, + 0xB6, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0x06, 0xD4, 0xB1, 0x8C, 0x9A, 0xBB, 0x89, 0x55, 0xFF, 0xAD, 0x73, 0x38, 0xFF, 0xAE, 0x73, + 0x33, 0xFF, 0xB2, 0x77, 0x35, 0xFF, 0xB5, 0x7B, 0x37, 0xFF, 0xB7, 0x7D, 0x38, 0xFF, 0xB9, 0x80, + 0x38, 0xFF, 0xBA, 0x81, 0x38, 0xFF, 0xBC, 0x82, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, + 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x82, + 0x38, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xC0, 0x8B, 0x46, 0xFF, 0xC5, 0x94, 0x55, 0xFF, 0xC5, 0x95, + 0x57, 0xFF, 0xC3, 0x93, 0x56, 0xFF, 0xBB, 0x90, 0x55, 0xFF, 0xC7, 0xB1, 0x92, 0xFF, 0xDC, 0xDB, + 0xD9, 0xFF, 0xDB, 0xDC, 0xDC, 0xFF, 0xDC, 0xDC, 0xDC, 0xFF, 0xDC, 0xDC, 0xDC, 0xFF, 0xDC, 0xDC, + 0xDC, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDF, 0xDF, 0xDE, 0xFF, 0xBD, 0xB5, 0xA2, 0xFF, 0xB6, 0xAB, + 0x91, 0xFF, 0xB6, 0xAA, 0x90, 0xFF, 0xE3, 0xE1, 0xDE, 0xFF, 0xD0, 0xCB, 0xBF, 0xFF, 0xB6, 0xAD, + 0x98, 0xFF, 0xD2, 0xD0, 0xC9, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDC, 0xDC, 0xDC, 0xFF, 0xDF, 0xDF, + 0xDF, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0xE3, 0xE3, 0xE4, 0xFF, 0xD8, 0xD6, 0xD2, 0xFF, 0xA6, 0x9C, + 0x81, 0xFF, 0xA2, 0x96, 0x78, 0xFF, 0xD6, 0xD3, 0xCC, 0xFF, 0xE1, 0xE1, 0xE3, 0xFF, 0xDF, 0xDE, + 0xDB, 0xFF, 0xB7, 0xA8, 0x8A, 0xFF, 0x9D, 0x75, 0x39, 0xFF, 0xB0, 0x7C, 0x37, 0xFF, 0xBA, 0x82, + 0x38, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, + 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBB, 0x82, 0x39, 0xFF, 0xBA, 0x81, + 0x38, 0xFF, 0xB9, 0x81, 0x3A, 0xFF, 0xC1, 0x8F, 0x53, 0xFF, 0xD5, 0xB1, 0x87, 0xDF, 0xE6, 0xD1, + 0xB7, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0x02, 0xD5, 0xB3, 0x8C, 0x87, 0xC0, 0x91, 0x5D, 0xFF, 0xB1, 0x79, 0x3D, 0xFF, 0xB1, 0x77, + 0x37, 0xFF, 0xB5, 0x7B, 0x39, 0xFF, 0xB8, 0x7F, 0x3A, 0xFF, 0xBA, 0x81, 0x3B, 0xFF, 0xBC, 0x83, + 0x3B, 0xFF, 0xBD, 0x85, 0x3C, 0xFF, 0xBE, 0x86, 0x3C, 0xFF, 0xBE, 0x86, 0x3C, 0xFF, 0xBE, 0x86, + 0x3C, 0xFF, 0xBE, 0x86, 0x3C, 0xFF, 0xBE, 0x86, 0x3C, 0xFF, 0xBE, 0x86, 0x3C, 0xFF, 0xBE, 0x86, + 0x3C, 0xFF, 0xC3, 0x8F, 0x4A, 0xFF, 0xCA, 0x99, 0x5B, 0xFF, 0xCA, 0x9A, 0x5D, 0xFF, 0xCA, 0x9A, + 0x5C, 0xFF, 0xCA, 0x9A, 0x5C, 0xFF, 0xC5, 0x98, 0x5B, 0xFF, 0xBE, 0x96, 0x5E, 0xFF, 0xCF, 0xBD, + 0xA5, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0xE0, 0xE0, + 0xE0, 0xFF, 0xE0, 0xE0, 0xE1, 0xFF, 0xE0, 0xDF, 0xDD, 0xFF, 0xC2, 0xBC, 0xAA, 0xFF, 0xE5, 0xE4, + 0xE1, 0xFF, 0xBE, 0xB6, 0xA1, 0xFF, 0xB6, 0xAB, 0x92, 0xFF, 0xE1, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, + 0xE2, 0xFF, 0xDC, 0xDC, 0xDD, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDD, 0xDD, + 0xDD, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE4, 0xE4, 0xE5, 0xFF, 0xE0, 0xDF, + 0xDD, 0xFF, 0xB5, 0xAE, 0x99, 0xFF, 0xA2, 0x97, 0x79, 0xFF, 0xD4, 0xD0, 0xC7, 0xFF, 0xE2, 0xE2, + 0xE4, 0xFF, 0xE0, 0xDD, 0xD8, 0xFF, 0xAA, 0x8B, 0x58, 0xFF, 0xAE, 0x7D, 0x38, 0xFF, 0xBC, 0x85, + 0x3C, 0xFF, 0xBE, 0x86, 0x3C, 0xFF, 0xBE, 0x86, 0x3C, 0xFF, 0xBE, 0x86, 0x3C, 0xFF, 0xBE, 0x86, + 0x3C, 0xFF, 0xBE, 0x86, 0x3C, 0xFF, 0xBE, 0x86, 0x3C, 0xFF, 0xBE, 0x86, 0x3C, 0xFF, 0xBD, 0x84, + 0x3B, 0xFF, 0xBD, 0x85, 0x3E, 0xFF, 0xC5, 0x96, 0x5B, 0xFF, 0xD7, 0xB6, 0x8C, 0xD0, 0xE6, 0xD1, + 0xB4, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xD8, 0xB6, 0x90, 0x6C, 0xC7, 0x99, 0x67, 0xFF, 0xB6, 0x7E, 0x43, 0xFF, 0xB4, 0x7B, + 0x3B, 0xFF, 0xB8, 0x7E, 0x3C, 0xFF, 0xBB, 0x82, 0x3D, 0xFF, 0xBD, 0x85, 0x3E, 0xFF, 0xBF, 0x87, + 0x3F, 0xFF, 0xC0, 0x89, 0x3F, 0xFF, 0xC1, 0x8A, 0x40, 0xFF, 0xC2, 0x8A, 0x40, 0xFF, 0xC2, 0x8A, + 0x40, 0xFF, 0xC2, 0x8A, 0x40, 0xFF, 0xC2, 0x8A, 0x40, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC4, 0x90, + 0x49, 0xFF, 0xCC, 0x9D, 0x60, 0xFF, 0xCE, 0x9F, 0x63, 0xFF, 0xCE, 0x9F, 0x63, 0xFF, 0xCE, 0x9F, + 0x63, 0xFF, 0xCD, 0x9F, 0x63, 0xFF, 0xCC, 0x9F, 0x63, 0xFF, 0xC9, 0x9C, 0x61, 0xFF, 0xC1, 0x9D, + 0x68, 0xFF, 0xD6, 0xCA, 0xB7, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE4, 0xE4, + 0xE4, 0xFF, 0xE4, 0xE4, 0xE5, 0xFF, 0xE1, 0xE0, 0xDD, 0xFF, 0xC0, 0xB8, 0xA5, 0xFF, 0xE4, 0xE2, + 0xDF, 0xFF, 0xE6, 0xE5, 0xE4, 0xFF, 0xBB, 0xB2, 0x9B, 0xFF, 0xBA, 0xAF, 0x97, 0xFF, 0xDF, 0xDD, + 0xDB, 0xFF, 0xDE, 0xDD, 0xDC, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, + 0xDD, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE5, 0xE5, + 0xE5, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xC5, 0xBF, 0xB1, 0xFF, 0xA7, 0x9D, 0x81, 0xFF, 0xD5, 0xD1, + 0xC8, 0xFF, 0xE7, 0xE5, 0xE2, 0xFF, 0xB4, 0x95, 0x65, 0xFF, 0xB2, 0x81, 0x3B, 0xFF, 0xBF, 0x89, + 0x40, 0xFF, 0xC2, 0x8A, 0x40, 0xFF, 0xC2, 0x8A, 0x40, 0xFF, 0xC2, 0x8A, 0x40, 0xFF, 0xC2, 0x8A, + 0x40, 0xFF, 0xC2, 0x8A, 0x40, 0xFF, 0xC2, 0x8A, 0x40, 0xFF, 0xC1, 0x89, 0x40, 0xFF, 0xC0, 0x88, + 0x3F, 0xFF, 0xC0, 0x8A, 0x44, 0xFF, 0xCB, 0x9D, 0x64, 0xFF, 0xDC, 0xBC, 0x95, 0xBC, 0xEF, 0xE2, + 0xD0, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xDC, 0xBD, 0x97, 0x4E, 0xCC, 0xA1, 0x70, 0xF3, 0xBB, 0x86, 0x4B, 0xFF, 0xB8, 0x7F, + 0x3F, 0xFF, 0xBB, 0x82, 0x40, 0xFF, 0xBE, 0x86, 0x41, 0xFF, 0xC0, 0x89, 0x42, 0xFF, 0xC2, 0x8A, + 0x42, 0xFF, 0xC3, 0x8C, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, + 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC5, 0x8F, 0x47, 0xFF, 0xCD, 0x9E, + 0x60, 0xFF, 0xD0, 0xA4, 0x69, 0xFF, 0xD0, 0xA3, 0x68, 0xFF, 0xD0, 0xA3, 0x68, 0xFF, 0xD0, 0xA3, + 0x68, 0xFF, 0xD0, 0xA3, 0x68, 0xFF, 0xD0, 0xA3, 0x68, 0xFF, 0xCF, 0xA3, 0x68, 0xFF, 0xCB, 0xA0, + 0x66, 0xFF, 0xC5, 0xA5, 0x75, 0xFF, 0xDD, 0xD5, 0xC8, 0xFF, 0xE7, 0xE8, 0xE8, 0xFF, 0xE7, 0xE7, + 0xE7, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE6, 0xE6, 0xE4, 0xFF, 0xBB, 0xB1, 0x99, 0xFF, 0xB6, 0xA6, + 0x86, 0xFF, 0xD1, 0xCA, 0xB9, 0xFF, 0xE4, 0xE3, 0xE1, 0xFF, 0xBC, 0xAF, 0x96, 0xFF, 0xB9, 0xA9, + 0x8A, 0xFF, 0xBE, 0xB0, 0x94, 0xFF, 0xDA, 0xD8, 0xD2, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xE0, 0xE0, + 0xE0, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE5, 0xE5, + 0xE5, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE9, 0xE9, 0xEA, 0xFF, 0xD4, 0xD0, 0xC5, 0xFF, 0xB8, 0xAE, + 0x95, 0xFF, 0xD9, 0xCE, 0xBB, 0xFF, 0xB5, 0x90, 0x56, 0xFF, 0xBA, 0x88, 0x41, 0xFF, 0xC3, 0x8D, + 0x44, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, + 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC3, 0x8D, 0x43, 0xFF, 0xC3, 0x8C, + 0x42, 0xFF, 0xC4, 0x8F, 0x4A, 0xFF, 0xD0, 0xA5, 0x6F, 0xFF, 0xDF, 0xC0, 0x9B, 0x9E, 0xFF, 0xFF, + 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xE6, 0xCF, 0xB1, 0x30, 0xD1, 0xA9, 0x79, 0xE2, 0xC1, 0x8E, 0x55, 0xFF, 0xBC, 0x83, + 0x44, 0xFF, 0xBE, 0x86, 0x44, 0xFF, 0xC1, 0x8A, 0x45, 0xFF, 0xC3, 0x8C, 0x46, 0xFF, 0xC5, 0x8E, + 0x46, 0xFF, 0xC7, 0x90, 0x47, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC8, 0x91, + 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC8, 0x90, 0x47, 0xFF, 0xCC, 0x9B, 0x59, 0xFF, 0xD3, 0xA8, + 0x6E, 0xFF, 0xD3, 0xA8, 0x6E, 0xFF, 0xD3, 0xA8, 0x6E, 0xFF, 0xD3, 0xA8, 0x6E, 0xFF, 0xD3, 0xA8, + 0x6E, 0xFF, 0xD3, 0xA8, 0x6E, 0xFF, 0xD3, 0xA8, 0x6E, 0xFF, 0xD3, 0xA8, 0x6E, 0xFF, 0xD2, 0xA8, + 0x6E, 0xFF, 0xCC, 0xA4, 0x6B, 0xFF, 0xCC, 0xAF, 0x84, 0xFF, 0xE3, 0xDE, 0xD5, 0xFF, 0xEA, 0xEA, + 0xEB, 0xFF, 0xE9, 0xE9, 0xEA, 0xFF, 0xE8, 0xE7, 0xE6, 0xFF, 0xB0, 0xA6, 0x8B, 0xFF, 0x9A, 0x89, + 0x5F, 0xFF, 0xB5, 0xAA, 0x8E, 0xFF, 0xE7, 0xE7, 0xE6, 0xFF, 0xC4, 0xBC, 0xAA, 0xFF, 0xA2, 0x8E, + 0x64, 0xFF, 0xA8, 0x94, 0x6C, 0xFF, 0xD4, 0xD0, 0xC5, 0xFF, 0xE2, 0xE2, 0xE3, 0xFF, 0xE1, 0xE1, + 0xE1, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xE4, 0xE4, + 0xE4, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE7, 0xE7, 0xE8, 0xFF, 0xEB, 0xEB, 0xEC, 0xFF, 0xE3, 0xDF, + 0xD7, 0xFF, 0xBD, 0xA8, 0x81, 0xFF, 0xB3, 0x89, 0x48, 0xFF, 0xBF, 0x8D, 0x46, 0xFF, 0xC5, 0x90, + 0x47, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC8, 0x91, + 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC5, 0x90, + 0x47, 0xFF, 0xC9, 0x96, 0x53, 0xFF, 0xD5, 0xAE, 0x7B, 0xFE, 0xE2, 0xC5, 0xA1, 0x78, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xEE, 0xDE, 0xC7, 0x12, 0xD7, 0xB1, 0x82, 0xC4, 0xC9, 0x98, 0x60, 0xFF, 0xC1, 0x89, + 0x4A, 0xFF, 0xC2, 0x8A, 0x48, 0xFF, 0xC4, 0x8D, 0x49, 0xFF, 0xC7, 0x90, 0x4A, 0xFF, 0xC9, 0x92, + 0x4A, 0xFF, 0xCA, 0x94, 0x4B, 0xFF, 0xCB, 0x95, 0x4B, 0xFF, 0xCB, 0x95, 0x4B, 0xFF, 0xCB, 0x95, + 0x4B, 0xFF, 0xCB, 0x95, 0x4B, 0xFF, 0xCC, 0x97, 0x4F, 0xFF, 0xD4, 0xA8, 0x6C, 0xFF, 0xD6, 0xAD, + 0x75, 0xFF, 0xD6, 0xAD, 0x74, 0xFF, 0xD6, 0xAD, 0x74, 0xFF, 0xD6, 0xAD, 0x74, 0xFF, 0xD6, 0xAD, + 0x74, 0xFF, 0xD6, 0xAD, 0x74, 0xFF, 0xD6, 0xAD, 0x74, 0xFF, 0xD6, 0xAD, 0x74, 0xFF, 0xD6, 0xAD, + 0x74, 0xFF, 0xD5, 0xAC, 0x74, 0xFF, 0xCF, 0xA8, 0x71, 0xFF, 0xD1, 0xB8, 0x93, 0xFF, 0xE7, 0xE4, + 0xDF, 0xFF, 0xEC, 0xEC, 0xED, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xD9, 0xD7, 0xCF, 0xFF, 0xC3, 0xBD, + 0xAC, 0xFF, 0xDA, 0xD8, 0xD0, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xD7, 0xD4, 0xCD, 0xFF, 0xBF, 0xB8, + 0xA4, 0xFF, 0xAC, 0xA1, 0x84, 0xFF, 0xCD, 0xC9, 0xBC, 0xFF, 0xE6, 0xE6, 0xE7, 0xFF, 0xE4, 0xE4, + 0xE4, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE4, 0xE4, + 0xE4, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xEC, 0xED, 0xED, 0xFF, 0xDA, 0xD6, + 0xC9, 0xFF, 0xB9, 0xA6, 0x80, 0xFF, 0xB6, 0x92, 0x59, 0xFF, 0xBB, 0x8D, 0x48, 0xFF, 0xC3, 0x92, + 0x4B, 0xFF, 0xC8, 0x94, 0x4B, 0xFF, 0xCB, 0x95, 0x4B, 0xFF, 0xCB, 0x95, 0x4B, 0xFF, 0xCB, 0x95, + 0x4B, 0xFF, 0xCB, 0x95, 0x4B, 0xFF, 0xCB, 0x95, 0x4B, 0xFF, 0xCB, 0x95, 0x4B, 0xFF, 0xCA, 0x94, + 0x4C, 0xFF, 0xCF, 0x9E, 0x5E, 0xFF, 0xDB, 0xB6, 0x86, 0xF1, 0xD7, 0xBF, 0xA0, 0x4D, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x02, 0xDE, 0xBB, 0x91, 0x92, 0xD0, 0xA2, 0x6C, 0xFF, 0xC5, 0x90, + 0x52, 0xFF, 0xC5, 0x8E, 0x4B, 0xFF, 0xC8, 0x91, 0x4C, 0xFF, 0xCB, 0x94, 0x4E, 0xFF, 0xCC, 0x96, + 0x4E, 0xFF, 0xCE, 0x98, 0x4F, 0xFF, 0xCF, 0x99, 0x4F, 0xFF, 0xCF, 0x99, 0x4F, 0xFF, 0xCF, 0x99, + 0x4F, 0xFF, 0xCF, 0x99, 0x4E, 0xFF, 0xD3, 0xA2, 0x5E, 0xFF, 0xD9, 0xB1, 0x79, 0xFF, 0xDA, 0xB1, + 0x7A, 0xFF, 0xDA, 0xB1, 0x7A, 0xFF, 0xDA, 0xB1, 0x7A, 0xFF, 0xDA, 0xB1, 0x7A, 0xFF, 0xDA, 0xB1, + 0x7A, 0xFF, 0xDA, 0xB1, 0x7A, 0xFF, 0xDA, 0xB1, 0x7A, 0xFF, 0xDA, 0xB1, 0x7A, 0xFF, 0xDA, 0xB1, + 0x7A, 0xFF, 0xDA, 0xB1, 0x7A, 0xFF, 0xD8, 0xB0, 0x79, 0xFF, 0xD1, 0xAD, 0x77, 0xFF, 0xD6, 0xC0, + 0xA0, 0xFF, 0xEA, 0xE8, 0xE5, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEF, 0xEF, + 0xF0, 0xFF, 0xED, 0xED, 0xEE, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xE8, 0xE9, + 0xE9, 0xFF, 0xDF, 0xDE, 0xDC, 0xFF, 0xDF, 0xDF, 0xDC, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE7, 0xE7, + 0xE7, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE8, 0xE8, + 0xE8, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xF2, 0xF2, 0xF1, 0xFF, 0xD7, 0xD3, + 0xC4, 0xFF, 0xB8, 0xAD, 0x8F, 0xFF, 0xC7, 0xB4, 0x91, 0xFF, 0xB3, 0x91, 0x56, 0xFF, 0xB8, 0x8D, + 0x4A, 0xFF, 0xC3, 0x94, 0x4E, 0xFF, 0xCB, 0x98, 0x4F, 0xFF, 0xCE, 0x99, 0x4F, 0xFF, 0xCF, 0x99, + 0x4F, 0xFF, 0xCF, 0x99, 0x4F, 0xFF, 0xCF, 0x99, 0x4F, 0xFF, 0xCE, 0x98, 0x4F, 0xFF, 0xCE, 0x99, + 0x52, 0xFF, 0xD5, 0xA8, 0x6B, 0xFF, 0xE0, 0xBF, 0x92, 0xD7, 0xCE, 0xBA, 0xA0, 0x22, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE3, 0xC4, 0x9E, 0x55, 0xD7, 0xAD, 0x7A, 0xF8, 0xCC, 0x99, + 0x5C, 0xFF, 0xC9, 0x92, 0x4F, 0xFF, 0xCC, 0x95, 0x50, 0xFF, 0xCD, 0x98, 0x51, 0xFF, 0xCF, 0x9A, + 0x51, 0xFF, 0xD0, 0x9C, 0x52, 0xFF, 0xD1, 0x9D, 0x52, 0xFF, 0xD2, 0x9D, 0x52, 0xFF, 0xD1, 0x9D, + 0x52, 0xFF, 0xD2, 0x9D, 0x53, 0xFF, 0xD9, 0xAD, 0x6E, 0xFF, 0xDD, 0xB7, 0x80, 0xFF, 0xDD, 0xB6, + 0x7F, 0xFF, 0xDD, 0xB6, 0x7F, 0xFF, 0xDD, 0xB6, 0x7F, 0xFF, 0xDD, 0xB6, 0x7F, 0xFF, 0xDD, 0xB6, + 0x7F, 0xFF, 0xDD, 0xB6, 0x7F, 0xFF, 0xDD, 0xB6, 0x7F, 0xFF, 0xDD, 0xB6, 0x7F, 0xFF, 0xDD, 0xB6, + 0x7F, 0xFF, 0xDD, 0xB6, 0x7F, 0xFF, 0xDD, 0xB6, 0x7F, 0xFF, 0xDB, 0xB5, 0x7F, 0xFF, 0xD4, 0xB1, + 0x7D, 0xFF, 0xDA, 0xC9, 0xAC, 0xFF, 0xED, 0xEC, 0xEA, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xF0, 0xEF, + 0xEF, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEB, 0xEB, + 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, + 0xEA, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEB, + 0xEB, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xE9, 0xE9, 0xE5, 0xFF, 0xEE, 0xEE, 0xEC, 0xFF, 0xF0, 0xF0, + 0xF0, 0xFF, 0xDE, 0xDA, 0xCF, 0xFF, 0xC9, 0xC1, 0xAA, 0xFF, 0xD0, 0xC3, 0xA8, 0xFF, 0xB5, 0x98, + 0x63, 0xFF, 0xB8, 0x90, 0x4E, 0xFF, 0xC9, 0x99, 0x52, 0xFF, 0xD0, 0x9C, 0x52, 0xFF, 0xD1, 0x9D, + 0x52, 0xFF, 0xD2, 0x9D, 0x52, 0xFF, 0xD1, 0x9D, 0x52, 0xFF, 0xD1, 0x9C, 0x53, 0xFF, 0xD2, 0xA0, + 0x5A, 0xFF, 0xDC, 0xB3, 0x7B, 0xFF, 0xDF, 0xC2, 0x9A, 0xA4, 0xC7, 0xBD, 0xAF, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEB, 0xD6, 0xB7, 0x22, 0xDD, 0xB7, 0x86, 0xD4, 0xD3, 0xA3, + 0x69, 0xFF, 0xCD, 0x97, 0x55, 0xFF, 0xCF, 0x98, 0x53, 0xFF, 0xD1, 0x9B, 0x54, 0xFF, 0xD2, 0x9D, + 0x55, 0xFF, 0xD3, 0x9F, 0x56, 0xFF, 0xD4, 0xA0, 0x56, 0xFF, 0xD5, 0xA1, 0x56, 0xFF, 0xD4, 0xA1, + 0x56, 0xFF, 0xD6, 0xA3, 0x5A, 0xFF, 0xDE, 0xB6, 0x7C, 0xFF, 0xE0, 0xBB, 0x85, 0xFF, 0xDF, 0xBB, + 0x84, 0xFF, 0xDF, 0xBB, 0x84, 0xFF, 0xDF, 0xBB, 0x84, 0xFF, 0xDF, 0xBB, 0x84, 0xFF, 0xDF, 0xBB, + 0x84, 0xFF, 0xDF, 0xBB, 0x84, 0xFF, 0xDF, 0xBB, 0x84, 0xFF, 0xDF, 0xBB, 0x84, 0xFF, 0xDF, 0xBB, + 0x84, 0xFF, 0xDF, 0xBB, 0x84, 0xFF, 0xE0, 0xBB, 0x84, 0xFF, 0xDF, 0xBB, 0x84, 0xFF, 0xDE, 0xB9, + 0x84, 0xFF, 0xD7, 0xB6, 0x84, 0xFF, 0xDE, 0xD0, 0xB6, 0xFF, 0xEF, 0xEF, 0xEE, 0xFF, 0xF1, 0xF1, + 0xF1, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEE, 0xEE, + 0xED, 0xFF, 0xE7, 0xE6, 0xE2, 0xFF, 0xEA, 0xEA, 0xE6, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEC, 0xEC, + 0xEC, 0xFF, 0xF1, 0xF1, 0xF2, 0xFF, 0xE6, 0xE4, 0xDC, 0xFF, 0xD0, 0xCB, 0xB9, 0xFF, 0xDC, 0xD4, + 0xC0, 0xFF, 0xBE, 0xA1, 0x6E, 0xFF, 0xC4, 0x98, 0x53, 0xFF, 0xD1, 0x9F, 0x56, 0xFF, 0xD4, 0xA1, + 0x56, 0xFF, 0xD5, 0xA1, 0x56, 0xFF, 0xD4, 0xA1, 0x56, 0xFF, 0xD4, 0xA0, 0x57, 0xFF, 0xD7, 0xA8, + 0x66, 0xFF, 0xE1, 0xBC, 0x8A, 0xFA, 0xE0, 0xC5, 0xA2, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x03, 0xE2, 0xC0, 0x93, 0x95, 0xD9, 0xAE, + 0x77, 0xFF, 0xD2, 0x9F, 0x5F, 0xFF, 0xD1, 0x9C, 0x57, 0xFF, 0xD4, 0x9E, 0x58, 0xFF, 0xD5, 0xA1, + 0x59, 0xFF, 0xD6, 0xA3, 0x5A, 0xFF, 0xD7, 0xA4, 0x5A, 0xFF, 0xD8, 0xA4, 0x5A, 0xFF, 0xD7, 0xA4, + 0x59, 0xFF, 0xDA, 0xA9, 0x63, 0xFF, 0xE2, 0xBC, 0x86, 0xFF, 0xE3, 0xBF, 0x8A, 0xFF, 0xE3, 0xBF, + 0x8A, 0xFF, 0xE3, 0xBF, 0x8A, 0xFF, 0xE3, 0xBF, 0x8A, 0xFF, 0xE3, 0xBF, 0x8A, 0xFF, 0xE3, 0xBF, + 0x8A, 0xFF, 0xE3, 0xBF, 0x8A, 0xFF, 0xE3, 0xBF, 0x8A, 0xFF, 0xE3, 0xBF, 0x8A, 0xFF, 0xE3, 0xBF, + 0x8A, 0xFF, 0xE3, 0xBF, 0x8A, 0xFF, 0xE3, 0xBF, 0x8A, 0xFF, 0xE3, 0xBF, 0x8A, 0xFF, 0xE2, 0xBF, + 0x8A, 0xFF, 0xE0, 0xBD, 0x89, 0xFF, 0xD9, 0xBB, 0x8B, 0xFF, 0xE2, 0xD5, 0xBF, 0xFF, 0xF1, 0xF1, + 0xF1, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF1, 0xF1, + 0xF1, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEF, 0xEF, + 0xEF, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xEF, 0xEF, 0xF0, 0xFF, 0xEF, 0xEE, 0xEE, 0xFF, 0xE7, 0xE6, + 0xE2, 0xFF, 0xEA, 0xEA, 0xE7, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xF0, 0xF0, + 0xF0, 0xFF, 0xF1, 0xF1, 0xF0, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xE9, 0xE8, 0xE2, 0xFF, 0xE5, 0xE2, + 0xD7, 0xFF, 0xD1, 0xBC, 0x97, 0xFF, 0xC4, 0x9A, 0x55, 0xFF, 0xD4, 0xA3, 0x5A, 0xFF, 0xD7, 0xA5, + 0x5A, 0xFF, 0xD8, 0xA5, 0x5A, 0xFF, 0xD7, 0xA4, 0x5A, 0xFF, 0xD7, 0xA6, 0x5E, 0xFF, 0xDD, 0xB3, + 0x76, 0xFF, 0xE6, 0xC5, 0x97, 0xD7, 0xD8, 0xC5, 0xAB, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0xCC, 0xA3, 0x44, 0xE0, 0xB8, + 0x85, 0xEE, 0xD8, 0xA8, 0x6C, 0xFF, 0xD5, 0xA0, 0x5D, 0xFF, 0xD6, 0xA2, 0x5C, 0xFF, 0xD8, 0xA4, + 0x5D, 0xFF, 0xD9, 0xA6, 0x5E, 0xFF, 0xDA, 0xA7, 0x5E, 0xFF, 0xDB, 0xA8, 0x5E, 0xFF, 0xDB, 0xA8, + 0x5D, 0xFF, 0xDD, 0xAE, 0x6A, 0xFF, 0xE5, 0xC1, 0x8D, 0xFF, 0xE6, 0xC2, 0x90, 0xFF, 0xE6, 0xC2, + 0x90, 0xFF, 0xE6, 0xC2, 0x90, 0xFF, 0xE6, 0xC2, 0x90, 0xFF, 0xE6, 0xC2, 0x90, 0xFF, 0xE6, 0xC2, + 0x90, 0xFF, 0xE6, 0xC2, 0x90, 0xFF, 0xE6, 0xC2, 0x90, 0xFF, 0xE6, 0xC2, 0x90, 0xFF, 0xE6, 0xC2, + 0x90, 0xFF, 0xE6, 0xC2, 0x90, 0xFF, 0xE6, 0xC2, 0x90, 0xFF, 0xE6, 0xC2, 0x90, 0xFF, 0xE6, 0xC2, + 0x90, 0xFF, 0xE5, 0xC2, 0x90, 0xFF, 0xE2, 0xC1, 0x8F, 0xFF, 0xDC, 0xBF, 0x92, 0xFF, 0xE5, 0xDA, + 0xC4, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF4, 0xF5, 0xF5, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF3, 0xF3, + 0xF3, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF2, 0xF2, + 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xEA, 0xEA, 0xE7, 0xFF, 0xEE, 0xEE, + 0xEB, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xEF, 0xEF, + 0xEC, 0xFF, 0xCF, 0xCB, 0xB8, 0xFF, 0xEB, 0xEA, 0xE4, 0xFF, 0xF2, 0xF2, 0xF4, 0xFF, 0xF1, 0xF0, + 0xED, 0xFF, 0xD1, 0xB8, 0x8C, 0xFF, 0xCC, 0xA0, 0x5A, 0xFF, 0xD8, 0xA7, 0x5E, 0xFF, 0xDB, 0xA8, + 0x5E, 0xFF, 0xDB, 0xA8, 0x5E, 0xFF, 0xDB, 0xA8, 0x5F, 0xFF, 0xDC, 0xAD, 0x69, 0xFF, 0xE4, 0xBE, + 0x88, 0xFF, 0xE8, 0xCC, 0xA2, 0x90, 0xB9, 0xC2, 0xCF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE5, 0xD4, 0xB9, 0x0E, 0xE3, 0xC0, + 0x91, 0xAF, 0xDF, 0xB4, 0x7C, 0xFF, 0xD9, 0xA7, 0x66, 0xFF, 0xD9, 0xA5, 0x60, 0xFF, 0xDA, 0xA8, + 0x60, 0xFF, 0xDB, 0xA9, 0x61, 0xFF, 0xDC, 0xAB, 0x62, 0xFF, 0xDD, 0xAC, 0x62, 0xFF, 0xDD, 0xAB, + 0x61, 0xFF, 0xE0, 0xB3, 0x6F, 0xFF, 0xE8, 0xC7, 0x93, 0xFF, 0xE9, 0xC8, 0x95, 0xFF, 0xE9, 0xC8, + 0x94, 0xFF, 0xE9, 0xC8, 0x94, 0xFF, 0xE9, 0xC8, 0x94, 0xFF, 0xE9, 0xC8, 0x94, 0xFF, 0xE9, 0xC8, + 0x94, 0xFF, 0xE9, 0xC8, 0x94, 0xFF, 0xE9, 0xC8, 0x94, 0xFF, 0xE9, 0xC8, 0x94, 0xFF, 0xE9, 0xC8, + 0x94, 0xFF, 0xE9, 0xC8, 0x94, 0xFF, 0xE9, 0xC8, 0x94, 0xFF, 0xE9, 0xC8, 0x94, 0xFF, 0xE9, 0xC8, + 0x94, 0xFF, 0xE8, 0xC8, 0x94, 0xFF, 0xE8, 0xC8, 0x94, 0xFF, 0xE5, 0xC4, 0x93, 0xFF, 0xDF, 0xC4, + 0x96, 0xFF, 0xE7, 0xDC, 0xC8, 0xFF, 0xF5, 0xF4, 0xF4, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xF5, 0xF5, + 0xF5, 0xFF, 0xF4, 0xF4, 0xF4, 0xFF, 0xF4, 0xF4, 0xF4, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF4, 0xF4, + 0xF4, 0xFF, 0xF4, 0xF4, 0xF4, 0xFF, 0xF1, 0xF0, 0xEE, 0xFF, 0xF2, 0xF2, 0xF1, 0xFF, 0xF4, 0xF4, + 0xF4, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xD7, 0xD5, + 0xC7, 0xFF, 0xCF, 0xCC, 0xB9, 0xFF, 0xF4, 0xF4, 0xF3, 0xFF, 0xF5, 0xF5, 0xF4, 0xFF, 0xDC, 0xCD, + 0xAF, 0xFF, 0xCB, 0xA4, 0x64, 0xFF, 0xD7, 0xA9, 0x61, 0xFF, 0xDD, 0xAC, 0x62, 0xFF, 0xDE, 0xAC, + 0x62, 0xFF, 0xDE, 0xAC, 0x62, 0xFF, 0xDE, 0xAD, 0x65, 0xFF, 0xE2, 0xB8, 0x7A, 0xFF, 0xE8, 0xC8, + 0x98, 0xE8, 0xE4, 0xCE, 0xAB, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE1, 0xC3, + 0x9A, 0x4F, 0xE5, 0xBE, 0x89, 0xF0, 0xDE, 0xB0, 0x73, 0xFF, 0xDC, 0xA9, 0x65, 0xFF, 0xDD, 0xAA, + 0x63, 0xFF, 0xDE, 0xAC, 0x64, 0xFF, 0xDF, 0xAE, 0x65, 0xFF, 0xDF, 0xAE, 0x65, 0xFF, 0xE0, 0xAF, + 0x64, 0xFF, 0xE2, 0xB6, 0x71, 0xFF, 0xEA, 0xCA, 0x96, 0xFF, 0xEB, 0xCB, 0x99, 0xFF, 0xEB, 0xCB, + 0x99, 0xFF, 0xEB, 0xCB, 0x99, 0xFF, 0xEB, 0xCB, 0x99, 0xFF, 0xEB, 0xCB, 0x99, 0xFF, 0xEB, 0xCB, + 0x99, 0xFF, 0xEB, 0xCB, 0x99, 0xFF, 0xEB, 0xCB, 0x99, 0xFF, 0xEB, 0xCB, 0x99, 0xFF, 0xEB, 0xCB, + 0x99, 0xFF, 0xEB, 0xCB, 0x99, 0xFF, 0xEB, 0xCB, 0x99, 0xFF, 0xEB, 0xCB, 0x99, 0xFF, 0xEB, 0xCB, + 0x99, 0xFF, 0xEB, 0xCB, 0x99, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xE7, 0xC9, + 0x98, 0xFF, 0xE2, 0xC8, 0x9B, 0xFF, 0xE9, 0xDD, 0xC8, 0xFF, 0xF5, 0xF5, 0xF4, 0xFF, 0xF7, 0xF7, + 0xF8, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xF6, 0xF6, 0xF7, 0xFF, 0xF3, 0xF2, + 0xF0, 0xFF, 0xF5, 0xF4, 0xF2, 0xFF, 0xF7, 0xF7, 0xF6, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xF6, 0xF6, + 0xF6, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xF6, 0xF6, 0xF7, 0xFF, 0xF7, 0xF7, 0xF7, 0xFF, 0xF1, 0xF0, + 0xED, 0xFF, 0xF5, 0xF5, 0xF3, 0xFF, 0xF9, 0xF9, 0xF9, 0xFF, 0xE4, 0xD7, 0xBE, 0xFF, 0xCB, 0xA7, + 0x68, 0xFF, 0xD7, 0xAA, 0x63, 0xFF, 0xDE, 0xAE, 0x65, 0xFF, 0xE0, 0xAF, 0x65, 0xFF, 0xE0, 0xAF, + 0x65, 0xFF, 0xE0, 0xAF, 0x67, 0xFF, 0xE2, 0xB4, 0x71, 0xFF, 0xE8, 0xC3, 0x8C, 0xFF, 0xEA, 0xCE, + 0xA3, 0x9B, 0xCB, 0xC7, 0xBD, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xCA, + 0xAD, 0x0D, 0xE8, 0xC5, 0x95, 0xA7, 0xE5, 0xBB, 0x84, 0xFF, 0xE0, 0xAF, 0x6F, 0xFF, 0xDF, 0xAD, + 0x67, 0xFF, 0xE0, 0xAF, 0x67, 0xFF, 0xE1, 0xB1, 0x68, 0xFF, 0xE1, 0xB2, 0x69, 0xFF, 0xE2, 0xB2, + 0x68, 0xFF, 0xE4, 0xB7, 0x72, 0xFF, 0xEB, 0xCC, 0x99, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xEC, 0xCE, + 0x9E, 0xFF, 0xEC, 0xCE, 0x9E, 0xFF, 0xEC, 0xCE, 0x9E, 0xFF, 0xEC, 0xCE, 0x9E, 0xFF, 0xEC, 0xCE, + 0x9E, 0xFF, 0xEC, 0xCE, 0x9E, 0xFF, 0xEC, 0xCE, 0x9E, 0xFF, 0xEC, 0xCE, 0x9E, 0xFF, 0xEC, 0xCE, + 0x9E, 0xFF, 0xEC, 0xCE, 0x9E, 0xFF, 0xEC, 0xCE, 0x9E, 0xFF, 0xEC, 0xCE, 0x9E, 0xFF, 0xEC, 0xCE, + 0x9E, 0xFF, 0xEC, 0xCE, 0x9E, 0xFF, 0xEC, 0xCE, 0x9E, 0xFF, 0xEC, 0xCE, 0x9E, 0xFF, 0xEC, 0xCE, + 0x9E, 0xFF, 0xEA, 0xCD, 0x9D, 0xFF, 0xE4, 0xCB, 0x9E, 0xFF, 0xE9, 0xDC, 0xC3, 0xFF, 0xF6, 0xF4, + 0xF1, 0xFF, 0xF9, 0xF9, 0xFA, 0xFF, 0xF9, 0xF9, 0xFA, 0xFF, 0xF2, 0xEF, 0xE8, 0xFF, 0xE0, 0xD2, + 0xB6, 0xFF, 0xE6, 0xDA, 0xC2, 0xFF, 0xF7, 0xF6, 0xF3, 0xFF, 0xF9, 0xF9, 0xF9, 0xFF, 0xF8, 0xF8, + 0xF8, 0xFF, 0xF9, 0xF8, 0xF8, 0xFF, 0xEF, 0xEF, 0xE9, 0xFF, 0xF5, 0xF5, 0xF3, 0xFF, 0xF9, 0xF9, + 0xFA, 0xFF, 0xFA, 0xFA, 0xFA, 0xFF, 0xEE, 0xE8, 0xD9, 0xFF, 0xD5, 0xB8, 0x85, 0xFF, 0xD8, 0xAC, + 0x66, 0xFF, 0xE0, 0xB2, 0x69, 0xFF, 0xE2, 0xB3, 0x69, 0xFF, 0xE2, 0xB3, 0x69, 0xFF, 0xE2, 0xB3, + 0x69, 0xFF, 0xE3, 0xB5, 0x6E, 0xFF, 0xE7, 0xBF, 0x82, 0xFF, 0xED, 0xCD, 0x9C, 0xE3, 0xE9, 0xD2, + 0xAE, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xE6, 0xCB, 0xA1, 0x3C, 0xEA, 0xC4, 0x91, 0xE3, 0xE5, 0xBA, 0x7F, 0xFF, 0xE2, 0xB2, + 0x6E, 0xFF, 0xE2, 0xB1, 0x6B, 0xFF, 0xE3, 0xB3, 0x6B, 0xFF, 0xE4, 0xB5, 0x6C, 0xFF, 0xE4, 0xB5, + 0x6C, 0xFF, 0xE6, 0xB8, 0x71, 0xFF, 0xED, 0xCD, 0x98, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEF, 0xD2, + 0xA3, 0xFF, 0xEF, 0xD2, 0xA3, 0xFF, 0xEF, 0xD2, 0xA3, 0xFF, 0xEF, 0xD2, 0xA3, 0xFF, 0xEF, 0xD2, + 0xA3, 0xFF, 0xEF, 0xD2, 0xA3, 0xFF, 0xEF, 0xD2, 0xA3, 0xFF, 0xEF, 0xD2, 0xA3, 0xFF, 0xEF, 0xD2, + 0xA3, 0xFF, 0xEF, 0xD2, 0xA3, 0xFF, 0xEF, 0xD2, 0xA3, 0xFF, 0xEF, 0xD2, 0xA3, 0xFF, 0xEF, 0xD2, + 0xA3, 0xFF, 0xEF, 0xD2, 0xA3, 0xFF, 0xEF, 0xD2, 0xA3, 0xFF, 0xEF, 0xD2, 0xA3, 0xFF, 0xEF, 0xD2, + 0xA3, 0xFF, 0xEE, 0xD2, 0xA3, 0xFF, 0xEC, 0xD0, 0xA2, 0xFF, 0xE8, 0xCE, 0xA1, 0xFF, 0xEA, 0xD8, + 0xB7, 0xFF, 0xF3, 0xEC, 0xDF, 0xFF, 0xF2, 0xEB, 0xDE, 0xFF, 0xE5, 0xD2, 0xAF, 0xFF, 0xE3, 0xCB, + 0x9F, 0xFF, 0xE4, 0xCC, 0xA1, 0xFF, 0xEB, 0xDC, 0xBF, 0xFF, 0xF8, 0xF6, 0xF1, 0xFF, 0xFB, 0xFB, + 0xFC, 0xFF, 0xF0, 0xEF, 0xE9, 0xFF, 0xCF, 0xCB, 0xB6, 0xFF, 0xF1, 0xF0, 0xEB, 0xFF, 0xFB, 0xFB, + 0xFC, 0xFF, 0xF1, 0xEB, 0xDE, 0xFF, 0xE1, 0xCD, 0xA7, 0xFF, 0xDF, 0xB9, 0x7B, 0xFF, 0xE2, 0xB4, + 0x6C, 0xFF, 0xE4, 0xB6, 0x6D, 0xFF, 0xE5, 0xB6, 0x6D, 0xFF, 0xE5, 0xB6, 0x6D, 0xFF, 0xE5, 0xB7, + 0x6F, 0xFF, 0xE7, 0xBD, 0x7C, 0xFF, 0xEC, 0xCB, 0x95, 0xFD, 0xED, 0xD2, 0xA7, 0x84, 0xD3, 0xD3, + 0xD4, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xC9, 0xD6, 0xE3, 0x02, 0xEB, 0xCC, 0x9C, 0x7C, 0xEA, 0xC4, 0x8E, 0xFC, 0xE6, 0xBA, + 0x7C, 0xFF, 0xE5, 0xB5, 0x70, 0xFF, 0xE5, 0xB6, 0x6F, 0xFF, 0xE6, 0xB7, 0x70, 0xFF, 0xE6, 0xB8, + 0x70, 0xFF, 0xE7, 0xB9, 0x70, 0xFF, 0xED, 0xCA, 0x91, 0xFF, 0xF1, 0xD5, 0xA8, 0xFF, 0xF1, 0xD5, + 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF1, 0xD5, + 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF1, 0xD5, + 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF1, 0xD5, + 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF1, 0xD5, + 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF0, 0xD5, 0xA7, 0xFF, 0xEF, 0xD4, 0xA7, 0xFF, 0xED, 0xD2, + 0xA5, 0xFF, 0xEB, 0xD3, 0xA9, 0xFF, 0xEB, 0xD3, 0xA9, 0xFF, 0xEC, 0xD2, 0xA5, 0xFF, 0xEF, 0xD4, + 0xA7, 0xFF, 0xEE, 0xD4, 0xA7, 0xFF, 0xEA, 0xD1, 0xA5, 0xFF, 0xEB, 0xDB, 0xBB, 0xFF, 0xF8, 0xF4, + 0xED, 0xFF, 0xF8, 0xF8, 0xF6, 0xFF, 0xF1, 0xF0, 0xE9, 0xFF, 0xFC, 0xFC, 0xFB, 0xFF, 0xF4, 0xEF, + 0xE3, 0xFF, 0xE4, 0xD2, 0xAF, 0xFF, 0xE7, 0xCD, 0x9F, 0xFF, 0xE6, 0xBC, 0x78, 0xFF, 0xE6, 0xB9, + 0x6F, 0xFF, 0xE7, 0xB9, 0x70, 0xFF, 0xE7, 0xB9, 0x70, 0xFF, 0xE7, 0xB9, 0x71, 0xFF, 0xE8, 0xBD, + 0x79, 0xFF, 0xEC, 0xC9, 0x90, 0xFF, 0xEF, 0xD3, 0xA3, 0xC1, 0xEA, 0xD6, 0xB5, 0x1D, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEB, 0xD4, 0xAF, 0x15, 0xED, 0xCC, 0x9A, 0xB3, 0xEB, 0xC5, + 0x8D, 0xFF, 0xE8, 0xBB, 0x7B, 0xFF, 0xE7, 0xB8, 0x73, 0xFF, 0xE8, 0xB9, 0x72, 0xFF, 0xE8, 0xBA, + 0x73, 0xFF, 0xE9, 0xBB, 0x72, 0xFF, 0xEC, 0xC5, 0x86, 0xFF, 0xF1, 0xD7, 0xAA, 0xFF, 0xF2, 0xD7, + 0xAC, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, + 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, + 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, + 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, + 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, + 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, + 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xED, 0xD4, 0xA9, 0xFF, 0xEC, 0xDA, + 0xB8, 0xFF, 0xF7, 0xF2, 0xE8, 0xFF, 0xFE, 0xFE, 0xFF, 0xFF, 0xF6, 0xF2, 0xE9, 0xFF, 0xE7, 0xD6, + 0xB4, 0xFF, 0xEB, 0xD4, 0xAA, 0xFF, 0xED, 0xCE, 0x98, 0xFF, 0xE9, 0xBD, 0x74, 0xFF, 0xE9, 0xBC, + 0x73, 0xFF, 0xE9, 0xBC, 0x73, 0xFF, 0xE9, 0xBC, 0x74, 0xFF, 0xEA, 0xBE, 0x79, 0xFF, 0xEC, 0xC8, + 0x8C, 0xFF, 0xF0, 0xD2, 0xA0, 0xE6, 0xEE, 0xD6, 0xB0, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC, 0xD2, 0xA8, 0x35, 0xEF, 0xCD, + 0x99, 0xD7, 0xED, 0xC7, 0x8D, 0xFF, 0xEA, 0xBE, 0x7D, 0xFF, 0xEA, 0xBC, 0x76, 0xFF, 0xEA, 0xBC, + 0x76, 0xFF, 0xEA, 0xBD, 0x76, 0xFF, 0xEC, 0xC0, 0x7B, 0xFF, 0xF2, 0xD5, 0xA4, 0xFF, 0xF3, 0xDA, + 0xB0, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, + 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, + 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, + 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, + 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, + 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, + 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF2, 0xDA, 0xAF, 0xFF, 0xEF, 0xD7, + 0xAE, 0xFF, 0xEE, 0xDB, 0xB8, 0xFF, 0xF6, 0xEC, 0xD9, 0xFF, 0xED, 0xDD, 0xBD, 0xFF, 0xED, 0xD6, + 0xAD, 0xFF, 0xF1, 0xD9, 0xAE, 0xFF, 0xED, 0xC9, 0x89, 0xFF, 0xEB, 0xBE, 0x75, 0xFF, 0xEB, 0xBF, + 0x77, 0xFF, 0xEB, 0xBF, 0x77, 0xFF, 0xEC, 0xC1, 0x7B, 0xFF, 0xEE, 0xC9, 0x8A, 0xFF, 0xF1, 0xD2, + 0x9E, 0xF6, 0xF0, 0xD7, 0xAD, 0x72, 0xDE, 0xDF, 0xE4, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xD3, + 0xA6, 0x50, 0xF1, 0xCF, 0x99, 0xE4, 0xEE, 0xC9, 0x8E, 0xFF, 0xEC, 0xC1, 0x7F, 0xFF, 0xEC, 0xBF, + 0x79, 0xFF, 0xEC, 0xC0, 0x79, 0xFF, 0xEC, 0xC0, 0x78, 0xFF, 0xF1, 0xCD, 0x91, 0xFF, 0xF5, 0xDC, + 0xB3, 0xFF, 0xF5, 0xDD, 0xB4, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, + 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, + 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, + 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, + 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, + 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, + 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF4, 0xDC, + 0xB3, 0xFF, 0xF3, 0xDB, 0xB3, 0xFF, 0xF2, 0xDB, 0xB3, 0xFF, 0xF2, 0xDB, 0xB3, 0xFF, 0xF3, 0xDC, + 0xB4, 0xFF, 0xF2, 0xD5, 0xA3, 0xFF, 0xED, 0xC3, 0x7D, 0xFF, 0xED, 0xC1, 0x79, 0xFF, 0xED, 0xC1, + 0x7A, 0xFF, 0xED, 0xC3, 0x7D, 0xFF, 0xEF, 0xCA, 0x8B, 0xFF, 0xF2, 0xD3, 0x9E, 0xFC, 0xF3, 0xD8, + 0xAA, 0x92, 0xE7, 0xDA, 0xC3, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF9, 0xFF, + 0xFF, 0x01, 0xF2, 0xD4, 0xA4, 0x5E, 0xF2, 0xD1, 0x9C, 0xEA, 0xF0, 0xCB, 0x90, 0xFF, 0xEE, 0xC3, + 0x81, 0xFF, 0xEE, 0xC2, 0x7D, 0xFF, 0xEE, 0xC2, 0x7C, 0xFF, 0xEF, 0xC5, 0x80, 0xFF, 0xF5, 0xD7, + 0xA7, 0xFF, 0xF6, 0xE0, 0xB8, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, + 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, + 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, + 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, + 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, + 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, + 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, + 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDE, + 0xB3, 0xFF, 0xF1, 0xCC, 0x8D, 0xFF, 0xEF, 0xC4, 0x7C, 0xFF, 0xEF, 0xC4, 0x7D, 0xFF, 0xEF, 0xC7, + 0x80, 0xFF, 0xF1, 0xCC, 0x8D, 0xFF, 0xF3, 0xD4, 0x9F, 0xFF, 0xF3, 0xD9, 0xA9, 0xA2, 0xEF, 0xDD, + 0xBE, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xE5, 0xE3, 0xDD, 0x03, 0xF2, 0xD6, 0xA7, 0x67, 0xF3, 0xD3, 0x9E, 0xEB, 0xF2, 0xCE, + 0x94, 0xFF, 0xF0, 0xC8, 0x86, 0xFF, 0xF0, 0xC5, 0x80, 0xFF, 0xF0, 0xC5, 0x7E, 0xFF, 0xF2, 0xCD, + 0x8D, 0xFF, 0xF6, 0xDE, 0xB4, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, + 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, + 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, + 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, + 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, + 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, + 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, + 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF4, 0xD5, + 0x9D, 0xFF, 0xF1, 0xC8, 0x80, 0xFF, 0xF0, 0xC8, 0x80, 0xFF, 0xF1, 0xC9, 0x84, 0xFF, 0xF3, 0xCF, + 0x91, 0xFF, 0xF5, 0xD6, 0xA1, 0xFE, 0xF5, 0xDA, 0xAB, 0xA9, 0xEF, 0xDE, 0xBF, 0x1C, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0xE5, 0xE2, 0x03, 0xF4, 0xD8, 0xA8, 0x60, 0xF4, 0xD4, + 0xA0, 0xE4, 0xF4, 0xD1, 0x98, 0xFF, 0xF2, 0xCC, 0x8B, 0xFF, 0xF2, 0xC9, 0x84, 0xFF, 0xF2, 0xC8, + 0x82, 0xFF, 0xF4, 0xD3, 0x98, 0xFF, 0xF8, 0xE2, 0xBA, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, + 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, + 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, + 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, + 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, + 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, + 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, + 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF6, 0xDA, 0xA8, 0xFF, 0xF3, 0xCB, + 0x86, 0xFF, 0xF2, 0xCA, 0x83, 0xFF, 0xF3, 0xCD, 0x89, 0xFF, 0xF4, 0xD2, 0x96, 0xFF, 0xF6, 0xD8, + 0xA3, 0xF9, 0xF6, 0xDB, 0xAC, 0x9E, 0xF1, 0xE0, 0xC1, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0xFA, 0xFF, 0x01, 0xF4, 0xDA, + 0xAD, 0x4E, 0xF6, 0xD7, 0xA2, 0xD3, 0xF5, 0xD4, 0x9D, 0xFF, 0xF4, 0xD0, 0x92, 0xFF, 0xF3, 0xCC, + 0x88, 0xFF, 0xF3, 0xCB, 0x85, 0xFF, 0xF5, 0xD5, 0x9D, 0xFF, 0xF9, 0xE4, 0xBC, 0xFF, 0xF9, 0xE6, + 0xC1, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC1, 0xFF, 0xF7, 0xDC, 0xAC, 0xFF, 0xF4, 0xCE, 0x8B, 0xFF, 0xF3, 0xCC, + 0x87, 0xFF, 0xF4, 0xD0, 0x90, 0xFF, 0xF6, 0xD5, 0x9D, 0xFF, 0xF7, 0xDA, 0xA6, 0xF0, 0xF7, 0xDC, + 0xAF, 0x84, 0xF3, 0xE2, 0xC5, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF4, 0xDB, 0xB1, 0x31, 0xF5, 0xD8, 0xA5, 0xAC, 0xF7, 0xD7, 0xA2, 0xFA, 0xF6, 0xD4, + 0x9B, 0xFF, 0xF5, 0xCF, 0x90, 0xFF, 0xF4, 0xCD, 0x8A, 0xFF, 0xF6, 0xD5, 0x9C, 0xFF, 0xFA, 0xE3, + 0xBC, 0xFF, 0xFA, 0xE7, 0xC4, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, + 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, + 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, + 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, + 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, + 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE7, 0xC4, 0xFF, 0xFA, 0xE6, + 0xC1, 0xFF, 0xF8, 0xDC, 0xAA, 0xFF, 0xF5, 0xD0, 0x8E, 0xFF, 0xF5, 0xD0, 0x8D, 0xFF, 0xF6, 0xD5, + 0x98, 0xFF, 0xF7, 0xD9, 0xA3, 0xFF, 0xF8, 0xDC, 0xAA, 0xD7, 0xF8, 0xDE, 0xB1, 0x5E, 0xF5, 0xE9, + 0xD4, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC, 0xD9, 0xBB, 0x12, 0xF5, 0xDA, 0xAA, 0x70, 0xF8, 0xD9, + 0xA4, 0xD8, 0xF8, 0xD8, 0xA1, 0xFF, 0xF7, 0xD5, 0x9A, 0xFF, 0xF6, 0xD1, 0x90, 0xFF, 0xF7, 0xD4, + 0x98, 0xFF, 0xF9, 0xE0, 0xB4, 0xFF, 0xFB, 0xE8, 0xC5, 0xFF, 0xFB, 0xE8, 0xC8, 0xFF, 0xFB, 0xE8, + 0xC8, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, + 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, + 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, + 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, + 0xC7, 0xFF, 0xFB, 0xE8, 0xC8, 0xFF, 0xFB, 0xE8, 0xC8, 0xFF, 0xFA, 0xE4, 0xBD, 0xFF, 0xF8, 0xD9, + 0xA2, 0xFF, 0xF7, 0xD2, 0x91, 0xFF, 0xF7, 0xD5, 0x97, 0xFF, 0xF8, 0xD9, 0xA2, 0xFF, 0xF8, 0xDB, + 0xA7, 0xF0, 0xF8, 0xDD, 0xAE, 0x9E, 0xF7, 0xE2, 0xBC, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xDB, + 0xB3, 0x2F, 0xF7, 0xDB, 0xA9, 0x99, 0xF9, 0xDB, 0xA6, 0xE9, 0xF9, 0xDA, 0xA3, 0xFF, 0xF8, 0xD6, + 0x9B, 0xFF, 0xF7, 0xD5, 0x98, 0xFF, 0xF9, 0xDB, 0xA7, 0xFF, 0xFB, 0xE4, 0xBD, 0xFF, 0xFC, 0xE9, + 0xC9, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, + 0xCA, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, + 0xCA, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, + 0xCA, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, + 0xCB, 0xFF, 0xFC, 0xE7, 0xC3, 0xFF, 0xFA, 0xE0, 0xB0, 0xFF, 0xF8, 0xD8, 0x9C, 0xFF, 0xF8, 0xD7, + 0x9A, 0xFF, 0xF9, 0xDA, 0xA3, 0xFF, 0xF9, 0xDD, 0xA9, 0xF8, 0xF9, 0xDE, 0xAC, 0xC0, 0xF9, 0xE0, + 0xB4, 0x52, 0xF7, 0xEB, 0xD7, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xED, 0xE0, 0xC9, 0x08, 0xF5, 0xDD, 0xB2, 0x42, 0xF8, 0xDC, 0xAA, 0x9E, 0xF9, 0xDC, + 0xA8, 0xE4, 0xF9, 0xDB, 0xA5, 0xFE, 0xF9, 0xD9, 0xA1, 0xFF, 0xF9, 0xDA, 0xA1, 0xFF, 0xFA, 0xDE, + 0xAC, 0xFF, 0xFB, 0xE4, 0xBB, 0xFF, 0xFC, 0xE9, 0xC7, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEB, + 0xCD, 0xFF, 0xFC, 0xEB, 0xCE, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, + 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, + 0xCE, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFB, 0xE7, 0xC0, 0xFF, 0xFA, 0xE1, + 0xB2, 0xFF, 0xFA, 0xDC, 0xA5, 0xFF, 0xF9, 0xDA, 0xA1, 0xFF, 0xFA, 0xDC, 0xA5, 0xFF, 0xFA, 0xDD, + 0xAA, 0xF3, 0xF9, 0xDE, 0xAD, 0xBF, 0xF7, 0xDF, 0xB2, 0x67, 0xF2, 0xE1, 0xC0, 0x18, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xE2, 0xCD, 0x08, 0xF5, 0xDD, + 0xB4, 0x36, 0xF8, 0xDE, 0xAD, 0x82, 0xFA, 0xDE, 0xAC, 0xC6, 0xFA, 0xDD, 0xA9, 0xF0, 0xFA, 0xDC, + 0xA6, 0xFF, 0xFA, 0xDD, 0xA7, 0xFF, 0xFB, 0xDE, 0xAC, 0xFF, 0xFB, 0xE2, 0xB3, 0xFF, 0xFB, 0xE5, + 0xBB, 0xFF, 0xFB, 0xE7, 0xC1, 0xFF, 0xFC, 0xE9, 0xC5, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xEA, + 0xCA, 0xFF, 0xFC, 0xEA, 0xC9, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xE8, 0xC3, 0xFF, 0xFC, 0xE6, + 0xBE, 0xFF, 0xFB, 0xE3, 0xB7, 0xFF, 0xFB, 0xE0, 0xAF, 0xFF, 0xFB, 0xDE, 0xA9, 0xFF, 0xFA, 0xDD, + 0xA7, 0xFF, 0xFB, 0xDE, 0xA9, 0xF9, 0xFA, 0xDF, 0xAE, 0xD9, 0xFA, 0xDF, 0xAF, 0x9F, 0xF6, 0xDF, + 0xB5, 0x51, 0xF5, 0xE1, 0xBE, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFB, 0xEA, 0xCC, 0x18, 0xFB, 0xE3, 0xB8, 0x42, 0xFB, 0xE2, + 0xB5, 0x7B, 0xFB, 0xE0, 0xAF, 0xAF, 0xFB, 0xDF, 0xAC, 0xD3, 0xFB, 0xDF, 0xAB, 0xE8, 0xFB, 0xDF, + 0xAC, 0xF8, 0xFB, 0xDF, 0xAD, 0xFF, 0xFB, 0xE0, 0xAE, 0xFF, 0xFB, 0xE0, 0xAF, 0xFF, 0xFB, 0xE1, + 0xB0, 0xFF, 0xFB, 0xE0, 0xB0, 0xFF, 0xFB, 0xE0, 0xAF, 0xFF, 0xFB, 0xE0, 0xAE, 0xFF, 0xFB, 0xE0, + 0xAD, 0xFC, 0xFB, 0xDF, 0xAC, 0xEF, 0xFB, 0xDF, 0xAD, 0xDC, 0xFB, 0xE0, 0xAF, 0xC0, 0xFB, 0xE2, + 0xB5, 0x91, 0xFB, 0xE4, 0xB9, 0x58, 0xFB, 0xE6, 0xC0, 0x26, 0xF8, 0xF8, 0xF4, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFC, 0xEB, 0xCC, 0x07, 0xFC, 0xE4, 0xBB, 0x1F, 0xFB, 0xE2, 0xB4, 0x37, 0xFB, 0xE0, + 0xAE, 0x50, 0xFB, 0xE0, 0xAF, 0x69, 0xFB, 0xE1, 0xB0, 0x7B, 0xFB, 0xE1, 0xAF, 0x85, 0xFB, 0xE1, + 0xB1, 0x8B, 0xFC, 0xE1, 0xB0, 0x88, 0xFB, 0xE1, 0xB0, 0x7F, 0xFB, 0xE1, 0xB0, 0x71, 0xFB, 0xE0, + 0xAF, 0x5A, 0xFB, 0xE2, 0xB3, 0x41, 0xFC, 0xE4, 0xBA, 0x29, 0xFC, 0xE8, 0xC4, 0x10, 0xFF, 0xFF, + 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xF6, 0xE8, 0x02, 0xFE, 0xED, + 0xCE, 0x03, 0xFD, 0xF2, 0xD9, 0x02, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFC, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, + 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, + 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, + 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xFE, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, + 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xFF, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, + 0x00, 0x00, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xC0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, + 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, + 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xF8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, + 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, + 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, + 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xF8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, + 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, + 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xFE, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, + 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0xFF, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, + 0x00, 0x00, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xF0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, + 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, + 0x01, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFE, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x28, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, + 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, + 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, + 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, + 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, + 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, + 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, + 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, + 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, + 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, + 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, + 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, + 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, + 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, + 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x0F, 0x82, 0x44, + 0x0C, 0x10, 0x82, 0x44, 0x0C, 0x12, 0x82, 0x44, 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, + 0x0C, 0x15, 0x82, 0x44, 0x0C, 0x16, 0x82, 0x44, 0x0C, 0x17, 0x82, 0x44, 0x0C, 0x17, 0x82, 0x44, + 0x0C, 0x18, 0x82, 0x44, 0x0C, 0x18, 0x82, 0x44, 0x0C, 0x19, 0x82, 0x44, 0x0C, 0x19, 0x82, 0x44, + 0x0C, 0x19, 0x82, 0x44, 0x0C, 0x18, 0x82, 0x44, 0x0C, 0x18, 0x82, 0x44, 0x0C, 0x17, 0x82, 0x44, + 0x0C, 0x17, 0x82, 0x44, 0x0C, 0x16, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, + 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x12, 0x82, 0x44, 0x0C, 0x10, 0x82, 0x44, 0x0C, 0x0F, 0x82, 0x44, + 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, + 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, + 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, + 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, + 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x11, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, + 0x0C, 0x17, 0x82, 0x44, 0x0C, 0x1A, 0x82, 0x44, 0x0C, 0x1C, 0x82, 0x44, 0x0C, 0x1F, 0x82, 0x44, + 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x24, 0x82, 0x44, 0x0C, 0x25, 0x82, 0x44, 0x0C, 0x28, 0x82, 0x44, + 0x0C, 0x29, 0x82, 0x44, 0x0C, 0x2A, 0x82, 0x44, 0x0C, 0x2B, 0x82, 0x44, 0x0C, 0x2C, 0x82, 0x44, + 0x0C, 0x2E, 0x82, 0x44, 0x0C, 0x2E, 0x82, 0x44, 0x0C, 0x2E, 0x82, 0x44, 0x0C, 0x2E, 0x82, 0x44, + 0x0C, 0x2E, 0x82, 0x44, 0x0C, 0x2E, 0x82, 0x44, 0x0C, 0x2E, 0x82, 0x44, 0x0C, 0x2D, 0x82, 0x44, + 0x0C, 0x2C, 0x82, 0x44, 0x0C, 0x2B, 0x82, 0x44, 0x0C, 0x29, 0x82, 0x44, 0x0C, 0x28, 0x82, 0x44, + 0x0C, 0x26, 0x82, 0x44, 0x0C, 0x24, 0x82, 0x44, 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x20, 0x82, 0x44, + 0x0C, 0x1D, 0x82, 0x44, 0x0C, 0x1B, 0x82, 0x44, 0x0C, 0x17, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, + 0x0C, 0x12, 0x82, 0x44, 0x0C, 0x0F, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, + 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, + 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, + 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x13, 0x82, 0x44, + 0x0C, 0x18, 0x82, 0x44, 0x0C, 0x1D, 0x82, 0x44, 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x27, 0x82, 0x44, + 0x0C, 0x2C, 0x82, 0x44, 0x0C, 0x30, 0x82, 0x44, 0x0C, 0x34, 0x82, 0x44, 0x0C, 0x37, 0x82, 0x44, + 0x0C, 0x3A, 0x82, 0x44, 0x0C, 0x3D, 0x82, 0x44, 0x0C, 0x40, 0x82, 0x44, 0x0C, 0x42, 0x82, 0x44, + 0x0C, 0x44, 0x82, 0x44, 0x0C, 0x46, 0x82, 0x44, 0x0C, 0x47, 0x82, 0x44, 0x0C, 0x48, 0x82, 0x44, + 0x0C, 0x4A, 0x82, 0x44, 0x0C, 0x4A, 0x82, 0x44, 0x0C, 0x4A, 0x82, 0x44, 0x0C, 0x4A, 0x82, 0x44, + 0x0C, 0x4A, 0x82, 0x44, 0x0C, 0x4A, 0x82, 0x44, 0x0C, 0x4A, 0x82, 0x44, 0x0C, 0x49, 0x82, 0x44, + 0x0C, 0x47, 0x82, 0x44, 0x0C, 0x46, 0x82, 0x44, 0x0C, 0x44, 0x82, 0x44, 0x0C, 0x42, 0x82, 0x44, + 0x0C, 0x40, 0x82, 0x44, 0x0C, 0x3E, 0x82, 0x44, 0x0C, 0x3A, 0x82, 0x44, 0x0C, 0x37, 0x82, 0x44, + 0x0C, 0x34, 0x82, 0x44, 0x0C, 0x31, 0x82, 0x44, 0x0C, 0x2C, 0x82, 0x44, 0x0C, 0x28, 0x82, 0x44, + 0x0C, 0x23, 0x82, 0x44, 0x0C, 0x1E, 0x82, 0x44, 0x0C, 0x19, 0x82, 0x44, 0x0C, 0x13, 0x82, 0x44, + 0x0C, 0x0F, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, + 0x0C, 0x02, 0x81, 0x43, 0x0B, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, + 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x12, 0x82, 0x44, 0x0C, 0x1B, 0x82, 0x44, 0x0C, 0x23, 0x82, 0x44, + 0x0C, 0x2B, 0x82, 0x44, 0x0C, 0x33, 0x82, 0x44, 0x0C, 0x3B, 0x82, 0x44, 0x0C, 0x41, 0x82, 0x44, + 0x0C, 0x47, 0x82, 0x44, 0x0C, 0x4C, 0x82, 0x44, 0x0C, 0x51, 0x82, 0x44, 0x0C, 0x55, 0x82, 0x44, + 0x0C, 0x59, 0x82, 0x44, 0x0C, 0x5C, 0x82, 0x44, 0x0C, 0x5F, 0x82, 0x44, 0x0C, 0x61, 0x82, 0x44, + 0x0C, 0x64, 0x82, 0x44, 0x0C, 0x66, 0x82, 0x44, 0x0C, 0x67, 0x82, 0x44, 0x0C, 0x69, 0x82, 0x44, + 0x0C, 0x6A, 0x82, 0x44, 0x0C, 0x6A, 0x82, 0x44, 0x0C, 0x6A, 0x82, 0x44, 0x0C, 0x6B, 0x82, 0x44, + 0x0C, 0x6B, 0x82, 0x44, 0x0C, 0x6A, 0x82, 0x44, 0x0C, 0x6A, 0x82, 0x44, 0x0C, 0x69, 0x82, 0x44, + 0x0C, 0x67, 0x82, 0x44, 0x0C, 0x66, 0x82, 0x44, 0x0C, 0x64, 0x82, 0x44, 0x0C, 0x62, 0x82, 0x44, + 0x0C, 0x60, 0x82, 0x44, 0x0C, 0x5D, 0x82, 0x44, 0x0C, 0x59, 0x82, 0x44, 0x0C, 0x55, 0x82, 0x44, + 0x0C, 0x51, 0x82, 0x44, 0x0C, 0x4D, 0x82, 0x44, 0x0C, 0x48, 0x82, 0x44, 0x0C, 0x42, 0x82, 0x44, + 0x0C, 0x3C, 0x82, 0x44, 0x0C, 0x34, 0x82, 0x44, 0x0C, 0x2D, 0x82, 0x44, 0x0C, 0x24, 0x82, 0x44, + 0x0C, 0x1C, 0x82, 0x44, 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, + 0x0C, 0x03, 0x81, 0x43, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x42, + 0x09, 0x01, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, + 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x1E, 0x82, 0x44, 0x0C, 0x2A, 0x82, 0x44, 0x0C, 0x37, 0x82, 0x44, + 0x0C, 0x43, 0x82, 0x44, 0x0C, 0x4E, 0x82, 0x44, 0x0C, 0x57, 0x82, 0x44, 0x0C, 0x5F, 0x82, 0x44, + 0x0C, 0x66, 0x82, 0x44, 0x0C, 0x6B, 0x82, 0x44, 0x0C, 0x70, 0x82, 0x44, 0x0C, 0x75, 0x82, 0x44, + 0x0C, 0x79, 0x82, 0x44, 0x0C, 0x7C, 0x82, 0x44, 0x0C, 0x7F, 0x82, 0x44, 0x0C, 0x81, 0x82, 0x44, + 0x0C, 0x83, 0x82, 0x44, 0x0C, 0x85, 0x82, 0x43, 0x0B, 0x86, 0x81, 0x43, 0x0A, 0x88, 0x81, 0x42, + 0x0A, 0x88, 0x81, 0x42, 0x09, 0x88, 0x81, 0x42, 0x09, 0x89, 0x81, 0x42, 0x09, 0x89, 0x81, 0x42, + 0x09, 0x89, 0x81, 0x43, 0x0A, 0x89, 0x82, 0x43, 0x0B, 0x89, 0x82, 0x44, 0x0C, 0x88, 0x82, 0x44, + 0x0C, 0x87, 0x82, 0x44, 0x0C, 0x85, 0x82, 0x44, 0x0C, 0x83, 0x82, 0x44, 0x0C, 0x81, 0x82, 0x44, + 0x0C, 0x7F, 0x82, 0x44, 0x0C, 0x7C, 0x82, 0x44, 0x0C, 0x79, 0x82, 0x44, 0x0C, 0x75, 0x82, 0x44, + 0x0C, 0x71, 0x82, 0x44, 0x0C, 0x6C, 0x82, 0x44, 0x0C, 0x66, 0x82, 0x44, 0x0C, 0x60, 0x82, 0x44, + 0x0C, 0x58, 0x82, 0x44, 0x0C, 0x4F, 0x82, 0x44, 0x0C, 0x45, 0x82, 0x44, 0x0C, 0x39, 0x82, 0x44, + 0x0C, 0x2C, 0x82, 0x44, 0x0C, 0x1F, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, + 0x0C, 0x06, 0x81, 0x43, 0x0B, 0x03, 0x8F, 0x57, 0x25, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x42, + 0x09, 0x01, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x10, 0x82, 0x44, + 0x0C, 0x1C, 0x82, 0x44, 0x0C, 0x2A, 0x82, 0x44, 0x0C, 0x3B, 0x82, 0x44, 0x0C, 0x4C, 0x82, 0x44, + 0x0C, 0x5B, 0x82, 0x44, 0x0C, 0x68, 0x82, 0x44, 0x0C, 0x73, 0x82, 0x44, 0x0C, 0x7B, 0x82, 0x44, + 0x0C, 0x83, 0x82, 0x44, 0x0C, 0x88, 0x82, 0x44, 0x0C, 0x8D, 0x82, 0x44, 0x0C, 0x91, 0x82, 0x44, + 0x0C, 0x95, 0x82, 0x44, 0x0C, 0x97, 0x81, 0x43, 0x0B, 0x99, 0x81, 0x42, 0x09, 0x9B, 0x81, 0x43, + 0x0A, 0x9D, 0x83, 0x46, 0x0E, 0xA0, 0x87, 0x4B, 0x14, 0xA4, 0x8B, 0x52, 0x1D, 0xA9, 0x8E, 0x57, + 0x25, 0xAF, 0x8F, 0x58, 0x28, 0xB2, 0x8F, 0x59, 0x28, 0xB3, 0x8F, 0x59, 0x28, 0xB2, 0x8F, 0x57, + 0x26, 0xB0, 0x8C, 0x53, 0x20, 0xAC, 0x87, 0x4C, 0x16, 0xA7, 0x84, 0x46, 0x0F, 0xA2, 0x82, 0x43, + 0x0B, 0xA0, 0x81, 0x42, 0x09, 0x9E, 0x81, 0x43, 0x0A, 0x9D, 0x82, 0x44, 0x0C, 0x9C, 0x82, 0x44, + 0x0C, 0x9A, 0x82, 0x44, 0x0C, 0x98, 0x82, 0x44, 0x0C, 0x95, 0x82, 0x44, 0x0C, 0x91, 0x82, 0x44, + 0x0C, 0x8D, 0x82, 0x44, 0x0C, 0x89, 0x82, 0x44, 0x0C, 0x83, 0x82, 0x44, 0x0C, 0x7C, 0x82, 0x44, + 0x0C, 0x74, 0x82, 0x44, 0x0C, 0x6A, 0x82, 0x44, 0x0C, 0x5D, 0x82, 0x44, 0x0C, 0x4E, 0x82, 0x44, + 0x0C, 0x3D, 0x82, 0x44, 0x0C, 0x2C, 0x82, 0x44, 0x0C, 0x1D, 0x82, 0x44, 0x0C, 0x11, 0x82, 0x44, + 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x04, 0x83, 0x46, 0x0F, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, + 0x0E, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, + 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x34, 0x82, 0x44, 0x0C, 0x47, 0x82, 0x44, 0x0C, 0x5B, 0x82, 0x44, + 0x0C, 0x6D, 0x82, 0x44, 0x0C, 0x7C, 0x82, 0x44, 0x0C, 0x87, 0x82, 0x44, 0x0C, 0x90, 0x82, 0x44, + 0x0C, 0x97, 0x82, 0x44, 0x0C, 0x9D, 0x82, 0x44, 0x0C, 0xA1, 0x82, 0x43, 0x0B, 0xA5, 0x81, 0x42, + 0x09, 0xA7, 0x83, 0x45, 0x0D, 0xAA, 0x8A, 0x50, 0x1C, 0xB3, 0x93, 0x5F, 0x31, 0xC1, 0x9A, 0x6B, + 0x44, 0xD1, 0x9C, 0x71, 0x4E, 0xDE, 0x9C, 0x73, 0x53, 0xE8, 0x9C, 0x74, 0x57, 0xF1, 0x9B, 0x74, + 0x58, 0xF6, 0x9A, 0x73, 0x58, 0xF8, 0x9A, 0x73, 0x58, 0xF9, 0x9A, 0x74, 0x59, 0xF8, 0x9C, 0x76, + 0x5B, 0xF7, 0x9E, 0x77, 0x5B, 0xF2, 0x9E, 0x76, 0x57, 0xEA, 0x9E, 0x74, 0x52, 0xE1, 0x9C, 0x6F, + 0x4A, 0xD6, 0x95, 0x63, 0x37, 0xC7, 0x8C, 0x53, 0x20, 0xB9, 0x84, 0x47, 0x10, 0xAF, 0x81, 0x42, + 0x0A, 0xAB, 0x81, 0x43, 0x0A, 0xAA, 0x82, 0x44, 0x0C, 0xA8, 0x82, 0x44, 0x0C, 0xA5, 0x82, 0x44, + 0x0C, 0xA2, 0x82, 0x44, 0x0C, 0x9D, 0x82, 0x44, 0x0C, 0x98, 0x82, 0x44, 0x0C, 0x91, 0x82, 0x44, + 0x0C, 0x89, 0x82, 0x44, 0x0C, 0x7E, 0x82, 0x44, 0x0C, 0x6F, 0x82, 0x44, 0x0C, 0x5D, 0x82, 0x44, + 0x0C, 0x4A, 0x82, 0x44, 0x0C, 0x36, 0x82, 0x44, 0x0C, 0x24, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, + 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x43, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x46, + 0x0F, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, + 0x0C, 0x24, 0x82, 0x44, 0x0C, 0x37, 0x82, 0x44, 0x0C, 0x4C, 0x82, 0x44, 0x0C, 0x61, 0x82, 0x44, + 0x0C, 0x74, 0x82, 0x44, 0x0C, 0x83, 0x82, 0x44, 0x0C, 0x8F, 0x82, 0x44, 0x0C, 0x98, 0x82, 0x44, + 0x0C, 0x9F, 0x81, 0x43, 0x0B, 0xA4, 0x81, 0x43, 0x0A, 0xA7, 0x88, 0x4D, 0x16, 0xB1, 0x94, 0x61, + 0x33, 0xC5, 0x9C, 0x70, 0x4B, 0xDD, 0x9B, 0x72, 0x53, 0xF0, 0x94, 0x6C, 0x50, 0xFB, 0x8C, 0x63, + 0x48, 0xFF, 0x85, 0x5B, 0x40, 0xFF, 0x7F, 0x55, 0x3A, 0xFF, 0x7C, 0x50, 0x36, 0xFF, 0x79, 0x4E, + 0x34, 0xFF, 0x79, 0x4D, 0x33, 0xFF, 0x79, 0x4D, 0x33, 0xFF, 0x7A, 0x4F, 0x35, 0xFF, 0x7C, 0x52, + 0x37, 0xFF, 0x80, 0x56, 0x3C, 0xFF, 0x85, 0x5C, 0x42, 0xFF, 0x8B, 0x63, 0x49, 0xFF, 0x92, 0x6B, + 0x51, 0xFF, 0x9A, 0x74, 0x5A, 0xFC, 0x9F, 0x79, 0x5C, 0xF4, 0x9F, 0x76, 0x53, 0xE4, 0x97, 0x66, + 0x3C, 0xCD, 0x8A, 0x51, 0x1C, 0xB9, 0x82, 0x43, 0x0B, 0xAE, 0x81, 0x43, 0x0A, 0xAC, 0x82, 0x44, + 0x0C, 0xAA, 0x82, 0x44, 0x0C, 0xA5, 0x82, 0x44, 0x0C, 0xA0, 0x82, 0x44, 0x0C, 0x99, 0x82, 0x44, + 0x0C, 0x91, 0x82, 0x44, 0x0C, 0x85, 0x82, 0x44, 0x0C, 0x76, 0x82, 0x44, 0x0C, 0x64, 0x82, 0x44, + 0x0C, 0x4F, 0x82, 0x44, 0x0C, 0x3A, 0x82, 0x44, 0x0C, 0x26, 0x82, 0x44, 0x0C, 0x17, 0x82, 0x44, + 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x43, 0x0B, 0x02, 0x87, 0x4A, 0x13, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, + 0x0E, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, + 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x34, 0x82, 0x44, 0x0C, 0x48, 0x82, 0x44, 0x0C, 0x5C, 0x82, 0x44, + 0x0C, 0x6E, 0x82, 0x44, 0x0C, 0x7D, 0x82, 0x44, 0x0C, 0x88, 0x82, 0x43, 0x0B, 0x91, 0x81, 0x43, + 0x0A, 0x96, 0x8A, 0x4F, 0x1A, 0xA4, 0x99, 0x68, 0x3F, 0xC6, 0x9C, 0x73, 0x52, 0xE9, 0x93, 0x6A, + 0x4E, 0xFB, 0x84, 0x5A, 0x3E, 0xFF, 0x79, 0x4C, 0x30, 0xFF, 0x72, 0x43, 0x28, 0xFF, 0x6E, 0x40, + 0x25, 0xFF, 0x6D, 0x3F, 0x24, 0xFF, 0x6D, 0x3F, 0x24, 0xFF, 0x6E, 0x40, 0x24, 0xFF, 0x70, 0x41, + 0x26, 0xFF, 0x71, 0x42, 0x27, 0xFF, 0x72, 0x43, 0x28, 0xFF, 0x72, 0x45, 0x29, 0xFF, 0x73, 0x46, + 0x2A, 0xFF, 0x74, 0x47, 0x2C, 0xFF, 0x75, 0x49, 0x2E, 0xFF, 0x77, 0x4A, 0x2F, 0xFF, 0x79, 0x4D, + 0x32, 0xFF, 0x7E, 0x52, 0x38, 0xFF, 0x85, 0x5B, 0x40, 0xFF, 0x8F, 0x67, 0x4D, 0xFF, 0x9B, 0x75, + 0x5A, 0xFD, 0xA2, 0x7B, 0x5D, 0xF0, 0x9D, 0x70, 0x49, 0xD3, 0x8D, 0x55, 0x22, 0xB2, 0x82, 0x43, + 0x0B, 0xA1, 0x81, 0x43, 0x0B, 0x9D, 0x82, 0x44, 0x0C, 0x99, 0x82, 0x44, 0x0C, 0x92, 0x82, 0x44, + 0x0C, 0x8A, 0x82, 0x44, 0x0C, 0x7E, 0x82, 0x44, 0x0C, 0x70, 0x82, 0x44, 0x0C, 0x5E, 0x82, 0x44, + 0x0C, 0x4B, 0x82, 0x44, 0x0C, 0x37, 0x82, 0x44, 0x0C, 0x24, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, + 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x43, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x42, + 0x09, 0x01, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x10, 0x82, 0x44, + 0x0C, 0x1C, 0x82, 0x44, 0x0C, 0x2B, 0x82, 0x44, 0x0C, 0x3C, 0x82, 0x44, 0x0C, 0x4D, 0x82, 0x44, + 0x0C, 0x5C, 0x82, 0x44, 0x0C, 0x69, 0x81, 0x42, 0x09, 0x72, 0x86, 0x4A, 0x13, 0x7F, 0x98, 0x67, + 0x3D, 0xAD, 0x9D, 0x73, 0x53, 0xE3, 0x8E, 0x64, 0x47, 0xFC, 0x7C, 0x4E, 0x31, 0xFF, 0x6F, 0x40, + 0x23, 0xFF, 0x6A, 0x3A, 0x1E, 0xFF, 0x69, 0x39, 0x1C, 0xFF, 0x6B, 0x3A, 0x1D, 0xFF, 0x6C, 0x3C, + 0x1E, 0xFF, 0x6E, 0x3E, 0x20, 0xFF, 0x70, 0x40, 0x21, 0xFF, 0x72, 0x42, 0x23, 0xFF, 0x74, 0x43, + 0x24, 0xFF, 0x75, 0x45, 0x26, 0xFF, 0x76, 0x46, 0x27, 0xFF, 0x77, 0x47, 0x28, 0xFF, 0x78, 0x48, + 0x29, 0xFF, 0x79, 0x49, 0x2A, 0xFF, 0x79, 0x4A, 0x2B, 0xFF, 0x79, 0x4B, 0x2C, 0xFF, 0x79, 0x4B, + 0x2D, 0xFF, 0x79, 0x4B, 0x2E, 0xFF, 0x7A, 0x4C, 0x30, 0xFF, 0x7C, 0x4F, 0x33, 0xFF, 0x81, 0x55, + 0x39, 0xFF, 0x8B, 0x61, 0x46, 0xFF, 0x99, 0x72, 0x58, 0xFF, 0xA4, 0x7E, 0x61, 0xEE, 0x9D, 0x70, + 0x48, 0xC0, 0x89, 0x4F, 0x19, 0x92, 0x81, 0x42, 0x09, 0x82, 0x82, 0x44, 0x0C, 0x7E, 0x82, 0x44, + 0x0C, 0x76, 0x82, 0x44, 0x0C, 0x6B, 0x82, 0x44, 0x0C, 0x5E, 0x82, 0x44, 0x0C, 0x4F, 0x82, 0x44, + 0x0C, 0x3E, 0x82, 0x44, 0x0C, 0x2D, 0x82, 0x44, 0x0C, 0x1E, 0x82, 0x44, 0x0C, 0x11, 0x82, 0x44, + 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x04, 0x83, 0x45, 0x0F, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x42, + 0x09, 0x01, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, + 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x1F, 0x82, 0x44, 0x0C, 0x2B, 0x82, 0x44, 0x0C, 0x38, 0x82, 0x43, + 0x0B, 0x44, 0x81, 0x42, 0x09, 0x4D, 0x95, 0x62, 0x33, 0x74, 0xA0, 0x76, 0x54, 0xC4, 0x92, 0x67, + 0x49, 0xF7, 0x7B, 0x4C, 0x2E, 0xFF, 0x6C, 0x3B, 0x1E, 0xFF, 0x67, 0x36, 0x18, 0xFF, 0x67, 0x36, + 0x18, 0xFF, 0x6A, 0x38, 0x19, 0xFF, 0x6C, 0x3A, 0x1B, 0xFF, 0x6F, 0x3C, 0x1C, 0xFF, 0x71, 0x3F, + 0x1D, 0xFF, 0x73, 0x41, 0x1F, 0xFF, 0x75, 0x43, 0x20, 0xFF, 0x77, 0x45, 0x22, 0xFF, 0x79, 0x47, + 0x23, 0xFF, 0x7A, 0x48, 0x24, 0xFF, 0x7C, 0x49, 0x26, 0xFF, 0x7D, 0x4B, 0x27, 0xFF, 0x7D, 0x4C, + 0x28, 0xFF, 0x7E, 0x4D, 0x29, 0xFF, 0x7E, 0x4D, 0x2A, 0xFF, 0x7F, 0x4E, 0x2B, 0xFF, 0x7F, 0x4E, + 0x2C, 0xFF, 0x7E, 0x4F, 0x2D, 0xFF, 0x7E, 0x4E, 0x2E, 0xFF, 0x7D, 0x4E, 0x2F, 0xFF, 0x7D, 0x4F, + 0x30, 0xFF, 0x7D, 0x50, 0x32, 0xFF, 0x82, 0x55, 0x39, 0xFF, 0x8D, 0x63, 0x47, 0xFF, 0x9D, 0x77, + 0x5B, 0xFC, 0xA6, 0x7F, 0x60, 0xD8, 0x9A, 0x6A, 0x3E, 0x90, 0x83, 0x45, 0x0D, 0x61, 0x81, 0x43, + 0x0A, 0x59, 0x82, 0x44, 0x0C, 0x51, 0x82, 0x44, 0x0C, 0x46, 0x82, 0x44, 0x0C, 0x3A, 0x82, 0x44, + 0x0C, 0x2D, 0x82, 0x44, 0x0C, 0x20, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, + 0x0C, 0x06, 0x81, 0x43, 0x0B, 0x03, 0x8C, 0x54, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, + 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x1C, 0x80, 0x41, 0x08, 0x23, 0x87, 0x4B, + 0x13, 0x2D, 0xA3, 0x78, 0x53, 0x76, 0x9C, 0x73, 0x54, 0xDE, 0x82, 0x54, 0x35, 0xFF, 0x6D, 0x3A, + 0x1B, 0xFF, 0x64, 0x31, 0x13, 0xFF, 0x63, 0x30, 0x11, 0xFF, 0x66, 0x31, 0x12, 0xFF, 0x69, 0x33, + 0x13, 0xFF, 0x6B, 0x36, 0x13, 0xFF, 0x6E, 0x39, 0x15, 0xFF, 0x71, 0x3C, 0x17, 0xFF, 0x74, 0x3F, + 0x19, 0xFF, 0x77, 0x42, 0x1B, 0xFF, 0x7A, 0x45, 0x1E, 0xFF, 0x7C, 0x47, 0x20, 0xFF, 0x7E, 0x4A, + 0x23, 0xFF, 0x80, 0x4C, 0x24, 0xFF, 0x81, 0x4D, 0x25, 0xFF, 0x82, 0x4E, 0x27, 0xFF, 0x83, 0x4F, + 0x28, 0xFF, 0x83, 0x50, 0x29, 0xFF, 0x84, 0x51, 0x2A, 0xFF, 0x84, 0x51, 0x2B, 0xFF, 0x84, 0x51, + 0x2C, 0xFF, 0x83, 0x52, 0x2D, 0xFF, 0x83, 0x52, 0x2E, 0xFF, 0x82, 0x52, 0x2E, 0xFF, 0x82, 0x51, + 0x2F, 0xFF, 0x81, 0x51, 0x30, 0xFF, 0x80, 0x51, 0x31, 0xFF, 0x80, 0x52, 0x34, 0xFF, 0x86, 0x5A, + 0x3C, 0xFF, 0x95, 0x6C, 0x50, 0xFF, 0xA6, 0x81, 0x64, 0xEE, 0xA8, 0x7F, 0x5C, 0x9A, 0x8C, 0x53, + 0x1F, 0x44, 0x80, 0x40, 0x07, 0x34, 0x82, 0x44, 0x0C, 0x2E, 0x82, 0x44, 0x0C, 0x25, 0x82, 0x44, + 0x0C, 0x1D, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, + 0x0C, 0x04, 0x83, 0x46, 0x0F, 0x02, 0xA0, 0x71, 0x46, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x85, 0x48, 0x11, 0x01, 0x82, 0x43, 0x0B, 0x02, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, + 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x0A, 0x7B, 0x3A, 0x00, 0x0D, 0x9B, 0x68, 0x39, 0x19, 0xA9, 0x82, + 0x62, 0x81, 0x93, 0x68, 0x48, 0xEE, 0x73, 0x41, 0x20, 0xFF, 0x62, 0x2C, 0x0C, 0xFF, 0x5E, 0x27, + 0x07, 0xFF, 0x5F, 0x28, 0x06, 0xFF, 0x62, 0x29, 0x06, 0xFF, 0x65, 0x2B, 0x06, 0xFF, 0x67, 0x2D, + 0x07, 0xFF, 0x6A, 0x30, 0x07, 0xFF, 0x6C, 0x32, 0x08, 0xFF, 0x6F, 0x34, 0x09, 0xFF, 0x71, 0x36, + 0x0A, 0xFF, 0x74, 0x38, 0x0B, 0xFF, 0x76, 0x3A, 0x0D, 0xFF, 0x78, 0x3D, 0x0F, 0xFF, 0x7B, 0x40, + 0x12, 0xFF, 0x7E, 0x44, 0x16, 0xFF, 0x80, 0x48, 0x1A, 0xFF, 0x83, 0x4C, 0x1F, 0xFF, 0x86, 0x50, + 0x24, 0xFF, 0x88, 0x52, 0x28, 0xFF, 0x89, 0x54, 0x29, 0xFF, 0x89, 0x55, 0x2A, 0xFF, 0x89, 0x55, + 0x2B, 0xFF, 0x89, 0x55, 0x2C, 0xFF, 0x88, 0x55, 0x2D, 0xFF, 0x88, 0x55, 0x2E, 0xFF, 0x87, 0x55, + 0x2F, 0xFF, 0x86, 0x55, 0x2F, 0xFF, 0x84, 0x54, 0x30, 0xFF, 0x83, 0x53, 0x31, 0xFF, 0x82, 0x53, + 0x32, 0xFF, 0x84, 0x56, 0x37, 0xFF, 0x8F, 0x64, 0x46, 0xFF, 0xA2, 0x7C, 0x60, 0xF9, 0xAE, 0x8A, + 0x6C, 0xA6, 0x9D, 0x6D, 0x42, 0x31, 0x7C, 0x3B, 0x00, 0x17, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, + 0x0C, 0x0F, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x04, 0x81, 0x43, + 0x0B, 0x02, 0x83, 0x46, 0x0E, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x4B, 0x14, 0x01, 0x83, 0x45, 0x0E, 0x01, 0x83, 0x45, + 0x0D, 0x02, 0x5F, 0x0F, 0x00, 0x03, 0xB2, 0x8C, 0x69, 0x10, 0xAC, 0x87, 0x69, 0x88, 0x8E, 0x61, + 0x40, 0xF6, 0x6D, 0x39, 0x16, 0xFF, 0x60, 0x29, 0x08, 0xFF, 0x5F, 0x27, 0x05, 0xFF, 0x62, 0x29, + 0x05, 0xFF, 0x65, 0x2C, 0x06, 0xFF, 0x68, 0x2E, 0x06, 0xFF, 0x6B, 0x31, 0x07, 0xFF, 0x6E, 0x33, + 0x07, 0xFF, 0x71, 0x35, 0x08, 0xFF, 0x73, 0x37, 0x08, 0xFF, 0x75, 0x39, 0x08, 0xFF, 0x77, 0x3A, + 0x09, 0xFF, 0x78, 0x3B, 0x09, 0xFF, 0x79, 0x3C, 0x09, 0xFF, 0x7A, 0x3C, 0x09, 0xFF, 0x7B, 0x3D, + 0x09, 0xFF, 0x7B, 0x3D, 0x09, 0xFF, 0x7C, 0x3E, 0x0A, 0xFF, 0x7D, 0x3F, 0x0C, 0xFF, 0x7F, 0x42, + 0x0F, 0xFF, 0x82, 0x46, 0x13, 0xFF, 0x85, 0x4C, 0x1A, 0xFF, 0x89, 0x52, 0x22, 0xFF, 0x8C, 0x56, + 0x28, 0xFF, 0x8D, 0x58, 0x2B, 0xFF, 0x8D, 0x59, 0x2C, 0xFF, 0x8C, 0x58, 0x2D, 0xFF, 0x8C, 0x58, + 0x2D, 0xFF, 0x8B, 0x58, 0x2E, 0xFF, 0x8A, 0x57, 0x2F, 0xFF, 0x88, 0x57, 0x30, 0xFF, 0x87, 0x56, + 0x30, 0xFF, 0x85, 0x55, 0x31, 0xFF, 0x85, 0x56, 0x34, 0xFF, 0x8C, 0x60, 0x40, 0xFF, 0xA0, 0x79, + 0x5B, 0xFE, 0xB2, 0x90, 0x73, 0xAF, 0xAE, 0x87, 0x65, 0x26, 0x6E, 0x25, 0x00, 0x07, 0x82, 0x44, + 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0D, 0x01, 0x84, 0x46, + 0x0F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xC9, 0xAA, 0x8F, 0x09, 0xAE, 0x89, 0x6C, 0x84, 0x8D, 0x60, 0x3E, 0xF8, 0x6C, 0x37, + 0x13, 0xFF, 0x61, 0x29, 0x07, 0xFF, 0x61, 0x29, 0x06, 0xFF, 0x65, 0x2C, 0x06, 0xFF, 0x68, 0x2E, + 0x07, 0xFF, 0x6B, 0x31, 0x07, 0xFF, 0x6C, 0x33, 0x08, 0xFF, 0x6D, 0x34, 0x08, 0xFF, 0x71, 0x37, + 0x09, 0xFF, 0x76, 0x3A, 0x09, 0xFF, 0x79, 0x3C, 0x0A, 0xFF, 0x7B, 0x3E, 0x0A, 0xFF, 0x7D, 0x3F, + 0x0A, 0xFF, 0x7E, 0x40, 0x0A, 0xFF, 0x7F, 0x40, 0x0A, 0xFF, 0x7F, 0x41, 0x0B, 0xFF, 0x80, 0x41, + 0x0B, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x81, 0x42, 0x0A, 0xFF, 0x81, 0x42, + 0x0A, 0xFF, 0x81, 0x42, 0x0A, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x81, 0x43, 0x0D, 0xFF, 0x84, 0x47, + 0x12, 0xFF, 0x88, 0x4D, 0x19, 0xFF, 0x8C, 0x54, 0x23, 0xFF, 0x8F, 0x59, 0x2A, 0xFF, 0x90, 0x5B, + 0x2D, 0xFF, 0x8F, 0x5B, 0x2E, 0xFF, 0x8E, 0x5A, 0x2F, 0xFF, 0x8D, 0x5A, 0x2F, 0xFF, 0x8B, 0x59, + 0x30, 0xFF, 0x8A, 0x58, 0x31, 0xFF, 0x87, 0x57, 0x31, 0xFF, 0x87, 0x57, 0x33, 0xFF, 0x8D, 0x5F, + 0x3E, 0xFF, 0xA0, 0x78, 0x5A, 0xFF, 0xB4, 0x92, 0x77, 0xAC, 0xBA, 0x97, 0x79, 0x1B, 0x00, 0x00, + 0x00, 0x00, 0x84, 0x46, 0x0F, 0x02, 0x84, 0x47, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0xDF, + 0xD2, 0x05, 0xB4, 0x91, 0x74, 0x77, 0x91, 0x63, 0x40, 0xF5, 0x6E, 0x38, 0x14, 0xFF, 0x63, 0x2B, + 0x07, 0xFF, 0x64, 0x2B, 0x06, 0xFF, 0x67, 0x2D, 0x07, 0xFF, 0x6B, 0x31, 0x07, 0xFF, 0x6D, 0x33, + 0x08, 0xFF, 0x6C, 0x34, 0x08, 0xFF, 0x67, 0x33, 0x07, 0xFF, 0x67, 0x36, 0x0B, 0xFF, 0x68, 0x35, + 0x06, 0xFF, 0x73, 0x3B, 0x0A, 0xFF, 0x7C, 0x3F, 0x0B, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x82, 0x43, + 0x0B, 0xFF, 0x83, 0x43, 0x0B, 0xFF, 0x83, 0x44, 0x0B, 0xFF, 0x84, 0x44, 0x0C, 0xFF, 0x84, 0x45, + 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, + 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x84, 0x45, + 0x0B, 0xFF, 0x84, 0x44, 0x0B, 0xFF, 0x84, 0x45, 0x0D, 0xFF, 0x87, 0x4A, 0x13, 0xFF, 0x8C, 0x52, + 0x1E, 0xFF, 0x91, 0x59, 0x28, 0xFF, 0x92, 0x5D, 0x2E, 0xFF, 0x92, 0x5D, 0x2F, 0xFF, 0x90, 0x5C, + 0x2F, 0xFF, 0x8E, 0x5B, 0x30, 0xFF, 0x8C, 0x5A, 0x31, 0xFF, 0x8A, 0x58, 0x31, 0xFF, 0x89, 0x58, + 0x33, 0xFF, 0x8F, 0x60, 0x3E, 0xFF, 0xA3, 0x7B, 0x5C, 0xFE, 0xB8, 0x97, 0x7B, 0x9D, 0xCA, 0xAD, + 0x95, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBA, 0x99, + 0x7D, 0x5B, 0x97, 0x6B, 0x48, 0xEF, 0x72, 0x3C, 0x17, 0xFF, 0x65, 0x2C, 0x08, 0xFF, 0x67, 0x2C, + 0x06, 0xFF, 0x6A, 0x2F, 0x07, 0xFF, 0x6E, 0x33, 0x07, 0xFF, 0x70, 0x35, 0x08, 0xFF, 0x6C, 0x34, + 0x07, 0xFF, 0x63, 0x32, 0x08, 0xFF, 0x80, 0x60, 0x3F, 0xFF, 0xBB, 0xAA, 0x99, 0xFF, 0x7F, 0x60, + 0x3F, 0xFF, 0x64, 0x36, 0x07, 0xFF, 0x75, 0x3E, 0x09, 0xFF, 0x80, 0x43, 0x0B, 0xFF, 0x85, 0x46, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x88, 0x48, + 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, + 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x86, 0x46, 0x0B, 0xFF, 0x86, 0x46, + 0x0C, 0xFF, 0x88, 0x49, 0x10, 0xFF, 0x8C, 0x51, 0x1A, 0xFF, 0x92, 0x5A, 0x28, 0xFF, 0x94, 0x5E, + 0x2F, 0xFF, 0x93, 0x5E, 0x30, 0xFF, 0x91, 0x5D, 0x30, 0xFF, 0x8F, 0x5B, 0x30, 0xFF, 0x8D, 0x5A, + 0x31, 0xFF, 0x8B, 0x59, 0x33, 0xFF, 0x92, 0x63, 0x40, 0xFF, 0xA7, 0x80, 0x60, 0xFB, 0xBE, 0x9E, + 0x84, 0x84, 0xE5, 0xD8, 0xCC, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0xA5, 0x8A, 0x32, 0xA1, 0x77, + 0x55, 0xD8, 0x79, 0x44, 0x1D, 0xFF, 0x68, 0x2F, 0x09, 0xFF, 0x69, 0x2E, 0x07, 0xFF, 0x6C, 0x31, + 0x07, 0xFF, 0x70, 0x34, 0x08, 0xFF, 0x72, 0x38, 0x09, 0xFF, 0x6D, 0x36, 0x07, 0xFF, 0x66, 0x3A, + 0x10, 0xFF, 0xA2, 0x8D, 0x77, 0xFF, 0xC0, 0xB7, 0xAC, 0xFF, 0xC1, 0xBB, 0xB1, 0xFF, 0xDC, 0xD7, + 0xCF, 0xFF, 0x9A, 0x83, 0x69, 0xFF, 0x68, 0x3E, 0x10, 0xFF, 0x73, 0x3E, 0x09, 0xFF, 0x81, 0x46, + 0x0C, 0xFF, 0x87, 0x48, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, + 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, + 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, + 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x49, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, + 0x0D, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x89, 0x4A, 0x10, 0xFF, 0x8E, 0x53, + 0x1B, 0xFF, 0x94, 0x5C, 0x29, 0xFF, 0x95, 0x5F, 0x2F, 0xFF, 0x93, 0x5E, 0x30, 0xFF, 0x91, 0x5D, + 0x30, 0xFF, 0x8F, 0x5B, 0x31, 0xFF, 0x8D, 0x5C, 0x34, 0xFF, 0x96, 0x68, 0x44, 0xFF, 0xAE, 0x88, + 0x68, 0xF0, 0xC4, 0xA8, 0x8F, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD4, 0xBC, 0xA5, 0x0F, 0xAD, 0x87, 0x66, 0xAC, 0x85, 0x52, + 0x2B, 0xFF, 0x6C, 0x32, 0x0B, 0xFF, 0x6A, 0x2F, 0x07, 0xFF, 0x6E, 0x32, 0x07, 0xFF, 0x73, 0x36, + 0x08, 0xFF, 0x75, 0x39, 0x09, 0xFF, 0x6F, 0x38, 0x07, 0xFF, 0x68, 0x3D, 0x11, 0xFF, 0xAC, 0x9B, + 0x87, 0xFF, 0xE6, 0xE5, 0xE4, 0xFF, 0xE5, 0xE5, 0xE4, 0xFF, 0xBE, 0xB9, 0xAF, 0xFF, 0xA4, 0x9B, + 0x8B, 0xFF, 0xD9, 0xD5, 0xCE, 0xFF, 0xB9, 0xA9, 0x96, 0xFF, 0x74, 0x4E, 0x22, 0xFF, 0x6F, 0x3D, + 0x08, 0xFF, 0x7F, 0x46, 0x0C, 0xFF, 0x87, 0x49, 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8C, 0x4B, + 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8C, 0x4B, + 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8C, 0x4B, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x89, 0x49, + 0x0C, 0xFF, 0x8B, 0x4C, 0x12, 0xFF, 0x91, 0x56, 0x1F, 0xFF, 0x96, 0x5F, 0x2C, 0xFF, 0x95, 0x60, + 0x30, 0xFF, 0x93, 0x5E, 0x30, 0xFF, 0x90, 0x5C, 0x30, 0xFF, 0x90, 0x5E, 0x35, 0xFF, 0x9D, 0x71, + 0x4C, 0xFF, 0xB6, 0x93, 0x74, 0xD1, 0xCD, 0xB2, 0x9A, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBB, 0x99, 0x7B, 0x65, 0x95, 0x66, 0x40, 0xF7, 0x73, 0x3A, + 0x12, 0xFF, 0x6B, 0x30, 0x07, 0xFF, 0x6F, 0x33, 0x08, 0xFF, 0x74, 0x37, 0x09, 0xFF, 0x77, 0x3A, + 0x09, 0xFF, 0x73, 0x3A, 0x08, 0xFF, 0x6A, 0x3C, 0x0F, 0xFF, 0xAB, 0x98, 0x83, 0xFF, 0xE8, 0xE7, + 0xE6, 0xFF, 0xE4, 0xE3, 0xE3, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE8, 0xE7, 0xE8, 0xFF, 0xCB, 0xC7, + 0xBE, 0xFF, 0x93, 0x88, 0x75, 0xFF, 0xC4, 0xBD, 0xB2, 0xFF, 0xD0, 0xC8, 0xBB, 0xFF, 0x86, 0x67, + 0x42, 0xFF, 0x6D, 0x3E, 0x09, 0xFF, 0x7C, 0x45, 0x0B, 0xFF, 0x87, 0x4A, 0x0D, 0xFF, 0x8C, 0x4C, + 0x0D, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, + 0x0E, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8D, 0x4C, + 0x0E, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8D, 0x4C, + 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8D, 0x4C, + 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8E, 0x50, 0x15, 0xFF, 0x95, 0x5C, + 0x26, 0xFF, 0x97, 0x61, 0x2F, 0xFF, 0x94, 0x5F, 0x30, 0xFF, 0x92, 0x5D, 0x30, 0xFF, 0x94, 0x63, + 0x39, 0xFF, 0xA8, 0x7E, 0x5A, 0xFF, 0xC0, 0x9F, 0x83, 0x93, 0xE4, 0xD4, 0xC3, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xCC, 0xAF, 0x95, 0x20, 0xA8, 0x7E, 0x5B, 0xCE, 0x7F, 0x49, 0x1F, 0xFF, 0x6E, 0x33, + 0x09, 0xFF, 0x70, 0x33, 0x07, 0xFF, 0x75, 0x37, 0x09, 0xFF, 0x79, 0x3C, 0x0A, 0xFF, 0x77, 0x3D, + 0x09, 0xFF, 0x6B, 0x3A, 0x0B, 0xFF, 0xA1, 0x8B, 0x73, 0xFF, 0xE7, 0xE6, 0xE4, 0xFF, 0xE6, 0xE6, + 0xE6, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE7, 0xE6, 0xE6, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xEA, 0xEA, + 0xEA, 0xFF, 0xD8, 0xD5, 0xD0, 0xFF, 0x8F, 0x83, 0x6E, 0xFF, 0xA7, 0x9D, 0x8E, 0xFF, 0xDA, 0xD5, + 0xCE, 0xFF, 0x9D, 0x87, 0x6B, 0xFF, 0x6E, 0x44, 0x12, 0xFF, 0x78, 0x43, 0x09, 0xFF, 0x86, 0x4A, + 0x0D, 0xFF, 0x8C, 0x4D, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4D, + 0x10, 0xFF, 0x93, 0x58, 0x1F, 0xFF, 0x97, 0x61, 0x2D, 0xFF, 0x95, 0x60, 0x2F, 0xFF, 0x93, 0x5F, + 0x31, 0xFF, 0x9B, 0x6C, 0x42, 0xFF, 0xB4, 0x8F, 0x6D, 0xEA, 0xCB, 0xAE, 0x94, 0x42, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xBA, 0x97, 0x77, 0x76, 0x94, 0x62, 0x39, 0xFD, 0x75, 0x3A, 0x0F, 0xFF, 0x71, 0x34, + 0x08, 0xFF, 0x76, 0x38, 0x08, 0xFF, 0x7B, 0x3C, 0x0A, 0xFF, 0x7D, 0x40, 0x0A, 0xFF, 0x71, 0x3B, + 0x07, 0xFF, 0x94, 0x77, 0x57, 0xFF, 0xE3, 0xE1, 0xDE, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE6, 0xE5, + 0xE5, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xEA, 0xE9, 0xE9, 0xFF, 0xEA, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, + 0xE9, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xE2, 0xE1, 0xDF, 0xFF, 0x97, 0x8C, 0x7B, 0xFF, 0x8C, 0x7F, + 0x69, 0xFF, 0xD3, 0xCF, 0xC8, 0xFF, 0xB5, 0xA7, 0x95, 0xFF, 0x76, 0x52, 0x23, 0xFF, 0x73, 0x41, + 0x08, 0xFF, 0x83, 0x4A, 0x0D, 0xFF, 0x8D, 0x4E, 0x0E, 0xFF, 0x90, 0x50, 0x0E, 0xFF, 0x91, 0x50, + 0x0F, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x91, 0x50, + 0x0E, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, + 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, + 0x0F, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x90, 0x4F, 0x0F, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x91, 0x54, 0x19, 0xFF, 0x97, 0x5F, 0x2A, 0xFF, 0x97, 0x61, + 0x2F, 0xFF, 0x97, 0x63, 0x35, 0xFF, 0xA8, 0x7C, 0x54, 0xFF, 0xC1, 0xA0, 0x81, 0xA4, 0xE0, 0xCD, + 0xBA, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD6, 0xBD, + 0xA6, 0x1C, 0xAB, 0x81, 0x5C, 0xCD, 0x83, 0x4A, 0x1E, 0xFF, 0x73, 0x36, 0x09, 0xFF, 0x76, 0x38, + 0x09, 0xFF, 0x7B, 0x3D, 0x0A, 0xFF, 0x81, 0x41, 0x0B, 0xFF, 0x7E, 0x41, 0x09, 0xFF, 0x90, 0x68, + 0x3E, 0xFF, 0xDF, 0xDA, 0xD3, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE7, 0xE7, + 0xE6, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xEB, 0xEB, 0xEA, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, + 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEA, 0xE9, 0xE8, 0xFF, 0xA6, 0x9D, + 0x8D, 0xFF, 0x7A, 0x6A, 0x4F, 0xFF, 0xC0, 0xB9, 0xB0, 0xFF, 0xCA, 0xC1, 0xB7, 0xFF, 0x86, 0x69, + 0x42, 0xFF, 0x70, 0x42, 0x0B, 0xFF, 0x80, 0x49, 0x0C, 0xFF, 0x8C, 0x4F, 0x0F, 0xFF, 0x91, 0x51, + 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x91, 0x52, 0x15, 0xFF, 0x97, 0x5E, + 0x27, 0xFF, 0x98, 0x62, 0x30, 0xFF, 0x9F, 0x6D, 0x41, 0xFF, 0xB7, 0x91, 0x6D, 0xEA, 0xCF, 0xB2, + 0x97, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0xA3, + 0x84, 0x5F, 0x9B, 0x6A, 0x3F, 0xF8, 0x7B, 0x3E, 0x11, 0xFF, 0x76, 0x38, 0x08, 0xFF, 0x7B, 0x3D, + 0x09, 0xFF, 0x81, 0x41, 0x0B, 0xFF, 0x86, 0x46, 0x0C, 0xFF, 0x84, 0x45, 0x09, 0xFF, 0xA7, 0x82, + 0x5A, 0xFF, 0xED, 0xEB, 0xE9, 0xFF, 0xEB, 0xEB, 0xEC, 0xFF, 0xEB, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, + 0xEA, 0xFF, 0xEA, 0xEA, 0xE9, 0xFF, 0xEB, 0xEA, 0xEA, 0xFF, 0xED, 0xED, 0xEC, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, + 0xEE, 0xFF, 0xB8, 0xB1, 0xA6, 0xFF, 0x73, 0x62, 0x46, 0xFF, 0xA9, 0x9F, 0x8D, 0xFF, 0xD6, 0xD2, + 0xCD, 0xFF, 0x9D, 0x88, 0x6B, 0xFF, 0x72, 0x49, 0x14, 0xFF, 0x7C, 0x48, 0x0C, 0xFF, 0x8B, 0x50, + 0x10, 0xFF, 0x93, 0x53, 0x10, 0xFF, 0x95, 0x54, 0x11, 0xFF, 0x95, 0x54, 0x11, 0xFF, 0x95, 0x54, + 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, + 0x0F, 0xFF, 0x95, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x54, 0x0F, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x52, + 0x13, 0xFF, 0x97, 0x5D, 0x25, 0xFF, 0x9B, 0x66, 0x34, 0xFF, 0xAE, 0x82, 0x58, 0xFF, 0xC7, 0xA6, + 0x87, 0x8F, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xEE, 0xE3, 0x09, 0xB7, 0x90, + 0x6C, 0xAA, 0x8E, 0x56, 0x28, 0xFF, 0x7A, 0x3B, 0x0B, 0xFF, 0x7C, 0x3C, 0x09, 0xFF, 0x81, 0x41, + 0x0A, 0xFF, 0x86, 0x46, 0x0C, 0xFF, 0x8B, 0x4A, 0x0D, 0xFF, 0x8D, 0x4D, 0x0D, 0xFF, 0x89, 0x50, + 0x13, 0xFF, 0xC0, 0xA8, 0x8C, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xED, 0xED, 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xED, 0xED, 0xEC, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xF0, 0xF1, + 0xF0, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xCA, 0xC5, 0xBE, 0xFF, 0x79, 0x69, 0x4A, 0xFF, 0x92, 0x85, + 0x6D, 0xFF, 0xD8, 0xD5, 0xD1, 0xFF, 0xB6, 0xA9, 0x97, 0xFF, 0x7B, 0x58, 0x29, 0xFF, 0x78, 0x48, + 0x0D, 0xFF, 0x8A, 0x51, 0x12, 0xFF, 0x94, 0x56, 0x13, 0xFF, 0x97, 0x58, 0x13, 0xFF, 0x98, 0x58, + 0x13, 0xFF, 0x98, 0x58, 0x13, 0xFF, 0x98, 0x58, 0x13, 0xFF, 0x98, 0x58, 0x13, 0xFF, 0x98, 0x57, + 0x13, 0xFF, 0x98, 0x57, 0x12, 0xFF, 0x97, 0x56, 0x11, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x97, 0x55, + 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x97, 0x55, 0x10, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x97, 0x56, + 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x92, 0x50, + 0x0E, 0xFF, 0x91, 0x52, 0x13, 0xFF, 0x98, 0x5E, 0x26, 0xFF, 0xA6, 0x75, 0x46, 0xFF, 0xBF, 0x9B, + 0x78, 0xD3, 0xD6, 0xBD, 0xA3, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0xBC, 0xA2, 0x2B, 0xAB, 0x7E, + 0x54, 0xE1, 0x85, 0x49, 0x18, 0xFF, 0x7C, 0x3C, 0x0A, 0xFF, 0x81, 0x40, 0x0A, 0xFF, 0x86, 0x45, + 0x0B, 0xFF, 0x8B, 0x4A, 0x0D, 0xFF, 0x90, 0x4E, 0x0E, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x91, 0x51, + 0x0D, 0xFF, 0x90, 0x5C, 0x1F, 0xFF, 0xD4, 0xC4, 0xB2, 0xFF, 0xF1, 0xF1, 0xF2, 0xFF, 0xED, 0xED, + 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, + 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF4, 0xF4, 0xF5, 0xFF, 0xDA, 0xD8, 0xD3, 0xFF, 0x87, 0x79, + 0x5F, 0xFF, 0x80, 0x6F, 0x50, 0xFF, 0xD0, 0xCC, 0xC3, 0xFF, 0xCF, 0xC9, 0xBE, 0xFF, 0x8B, 0x70, + 0x49, 0xFF, 0x76, 0x4A, 0x11, 0xFF, 0x87, 0x52, 0x12, 0xFF, 0x94, 0x58, 0x14, 0xFF, 0x9A, 0x5A, + 0x14, 0xFF, 0x9B, 0x5B, 0x14, 0xFF, 0x9B, 0x5B, 0x14, 0xFF, 0x9B, 0x5B, 0x14, 0xFF, 0x9B, 0x5B, + 0x14, 0xFF, 0x9B, 0x5B, 0x14, 0xFF, 0x9B, 0x5B, 0x14, 0xFF, 0x9B, 0x5A, 0x14, 0xFF, 0x9A, 0x5A, + 0x13, 0xFF, 0x99, 0x58, 0x12, 0xFF, 0x99, 0x57, 0x10, 0xFF, 0x99, 0x57, 0x10, 0xFF, 0x99, 0x57, + 0x10, 0xFF, 0x99, 0x57, 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x96, 0x54, + 0x0F, 0xFF, 0x93, 0x51, 0x0E, 0xFF, 0x92, 0x52, 0x13, 0xFF, 0x9F, 0x67, 0x32, 0xFF, 0xB8, 0x8F, + 0x67, 0xF6, 0xD0, 0xB2, 0x95, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0xA7, 0x86, 0x5E, 0xA0, 0x6D, + 0x40, 0xF9, 0x82, 0x43, 0x11, 0xFF, 0x80, 0x3F, 0x0A, 0xFF, 0x85, 0x45, 0x0B, 0xFF, 0x8A, 0x4A, + 0x0D, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x98, 0x57, + 0x10, 0xFF, 0x92, 0x54, 0x0E, 0xFF, 0x9E, 0x71, 0x3B, 0xFF, 0xE2, 0xDB, 0xD0, 0xFF, 0xEF, 0xF0, + 0xF1, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xF1, 0xF1, + 0xF1, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF3, 0xF3, 0xF4, 0xFF, 0xE5, 0xE4, + 0xE3, 0xFF, 0x9A, 0x8F, 0x78, 0xFF, 0x75, 0x62, 0x3E, 0xFF, 0xC0, 0xB8, 0xAA, 0xFF, 0xDE, 0xDC, + 0xD8, 0xFF, 0xA0, 0x8D, 0x70, 0xFF, 0x78, 0x51, 0x1B, 0xFF, 0x84, 0x52, 0x13, 0xFF, 0x94, 0x5A, + 0x17, 0xFF, 0x9B, 0x5D, 0x17, 0xFF, 0x9D, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, + 0x18, 0xFF, 0x9E, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, + 0x17, 0xFF, 0x9E, 0x5E, 0x17, 0xFF, 0x9D, 0x5D, 0x15, 0xFF, 0x9C, 0x5B, 0x13, 0xFF, 0x9B, 0x59, + 0x11, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x9A, 0x58, 0x11, 0xFF, 0x98, 0x57, + 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x93, 0x52, 0x0E, 0xFF, 0x96, 0x58, 0x1A, 0xFF, 0xB1, 0x83, + 0x54, 0xFF, 0xC3, 0xA4, 0x83, 0x8E, 0x00, 0x24, 0x4C, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x02, 0xBF, 0x99, 0x74, 0x92, 0x98, 0x61, + 0x30, 0xFF, 0x82, 0x42, 0x0D, 0xFF, 0x84, 0x43, 0x0A, 0xFF, 0x8A, 0x49, 0x0C, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x9A, 0x59, 0x12, 0xFF, 0x9D, 0x5D, + 0x15, 0xFF, 0x9F, 0x61, 0x19, 0xFF, 0x97, 0x5C, 0x16, 0xFF, 0xAD, 0x89, 0x5D, 0xFF, 0xE7, 0xE4, + 0xE0, 0xFF, 0xEB, 0xEB, 0xEC, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEB, 0xEB, + 0xEB, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xF1, 0xF1, + 0xF1, 0xFF, 0xEC, 0xEB, 0xEB, 0xFF, 0xB0, 0xA7, 0x96, 0xFF, 0x74, 0x61, 0x3B, 0xFF, 0xAD, 0xA2, + 0x8E, 0xFF, 0xE4, 0xE4, 0xE1, 0xFF, 0xB8, 0xAD, 0x99, 0xFF, 0x80, 0x5F, 0x2F, 0xFF, 0x80, 0x52, + 0x14, 0xFF, 0x93, 0x5B, 0x19, 0xFF, 0x9D, 0x60, 0x1A, 0xFF, 0xA0, 0x62, 0x1B, 0xFF, 0xA1, 0x62, + 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, 0x1A, 0xFF, 0xA1, 0x62, 0x1A, 0xFF, 0xA1, 0x62, + 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, 0x1A, 0xFF, 0xA0, 0x60, + 0x18, 0xFF, 0x9E, 0x5D, 0x13, 0xFF, 0x9D, 0x5B, 0x11, 0xFF, 0x9C, 0x5B, 0x11, 0xFF, 0x9B, 0x5A, + 0x11, 0xFF, 0x9A, 0x58, 0x10, 0xFF, 0x97, 0x56, 0x0F, 0xFF, 0x95, 0x54, 0x11, 0xFF, 0xA6, 0x70, + 0x39, 0xFF, 0xC1, 0x9E, 0x79, 0xC0, 0xC5, 0xB4, 0xA2, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0xD9, 0xC7, 0x0F, 0xBA, 0x91, 0x68, 0xBB, 0x93, 0x58, + 0x24, 0xFF, 0x84, 0x43, 0x0C, 0xFF, 0x89, 0x47, 0x0B, 0xFF, 0x8E, 0x4D, 0x0D, 0xFF, 0x93, 0x51, + 0x0E, 0xFF, 0x97, 0x55, 0x10, 0xFF, 0x9C, 0x5C, 0x14, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA3, 0x65, + 0x1D, 0xFF, 0xA4, 0x65, 0x1E, 0xFF, 0xA2, 0x64, 0x1D, 0xFF, 0x99, 0x60, 0x1C, 0xFF, 0xBA, 0x9F, + 0x7C, 0xFF, 0xE7, 0xE7, 0xE6, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE7, 0xE7, + 0xE7, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE8, 0xE8, + 0xE8, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, + 0xEC, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xEE, 0xFF, 0xC3, 0xBE, 0xB2, 0xFF, 0x7B, 0x69, + 0x45, 0xFF, 0x9B, 0x8C, 0x71, 0xFF, 0xE1, 0xDF, 0xDC, 0xFF, 0xCE, 0xC8, 0xBD, 0xFF, 0x8E, 0x74, + 0x4C, 0xFF, 0x7E, 0x54, 0x19, 0xFF, 0x90, 0x5C, 0x1B, 0xFF, 0x9D, 0x62, 0x1D, 0xFF, 0xA2, 0x65, + 0x1D, 0xFF, 0xA4, 0x65, 0x1D, 0xFF, 0xA4, 0x65, 0x1D, 0xFF, 0xA4, 0x65, 0x1D, 0xFF, 0xA4, 0x65, + 0x1D, 0xFF, 0xA4, 0x65, 0x1D, 0xFF, 0xA4, 0x65, 0x1D, 0xFF, 0xA4, 0x65, 0x1E, 0xFF, 0xA4, 0x65, + 0x1E, 0xFF, 0xA4, 0x65, 0x1D, 0xFF, 0xA2, 0x62, 0x18, 0xFF, 0x9F, 0x5E, 0x13, 0xFF, 0x9E, 0x5C, + 0x12, 0xFF, 0x9D, 0x5B, 0x11, 0xFF, 0x9B, 0x59, 0x11, 0xFF, 0x98, 0x56, 0x10, 0xFF, 0xA0, 0x64, + 0x26, 0xFF, 0xBF, 0x96, 0x6B, 0xE1, 0xE0, 0xCA, 0xB1, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDA, 0xC1, 0xA6, 0x1F, 0xB4, 0x88, 0x5B, 0xD9, 0x91, 0x53, + 0x1D, 0xFF, 0x88, 0x46, 0x0B, 0xFF, 0x8D, 0x4B, 0x0C, 0xFF, 0x92, 0x50, 0x0E, 0xFF, 0x98, 0x56, + 0x11, 0xFF, 0x9F, 0x5F, 0x19, 0xFF, 0xA4, 0x66, 0x1F, 0xFF, 0xA6, 0x68, 0x21, 0xFF, 0xA7, 0x69, + 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA4, 0x67, 0x1F, 0xFF, 0x9C, 0x68, + 0x27, 0xFF, 0xC5, 0xB2, 0x9A, 0xFF, 0xE4, 0xE5, 0xE6, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE2, 0xE2, + 0xE2, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE3, 0xE3, + 0xE3, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE8, 0xE8, + 0xE8, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, 0xEA, 0xFF, 0xEC, 0xEC, 0xED, 0xFF, 0xD4, 0xD0, + 0xC9, 0xFF, 0x88, 0x78, 0x57, 0xFF, 0x8C, 0x7A, 0x58, 0xFF, 0xD7, 0xD3, 0xCC, 0xFF, 0xDC, 0xDA, + 0xD7, 0xFF, 0xA1, 0x8F, 0x70, 0xFF, 0x7F, 0x5A, 0x22, 0xFF, 0x8D, 0x5C, 0x1C, 0xFF, 0x9D, 0x65, + 0x20, 0xFF, 0xA5, 0x68, 0x20, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, + 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, + 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA6, 0x68, 0x1E, 0xFF, 0xA3, 0x62, + 0x16, 0xFF, 0x9F, 0x5D, 0x12, 0xFF, 0x9E, 0x5B, 0x11, 0xFF, 0x9B, 0x59, 0x10, 0xFF, 0x9F, 0x61, + 0x1F, 0xFF, 0xBA, 0x8D, 0x5D, 0xF1, 0xDC, 0xC4, 0xAA, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0xBB, 0x9E, 0x34, 0xB1, 0x81, 0x51, 0xEB, 0x91, 0x51, + 0x18, 0xFF, 0x8C, 0x49, 0x0C, 0xFF, 0x91, 0x4F, 0x0D, 0xFF, 0x98, 0x57, 0x13, 0xFF, 0xA1, 0x62, + 0x1D, 0xFF, 0xA6, 0x69, 0x23, 0xFF, 0xA9, 0x6B, 0x24, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAA, 0x6D, + 0x24, 0xFF, 0xAB, 0x6D, 0x24, 0xFF, 0xAB, 0x6D, 0x24, 0xFF, 0xAA, 0x6E, 0x24, 0xFF, 0xA5, 0x6A, + 0x22, 0xFF, 0xA2, 0x73, 0x37, 0xFF, 0xCE, 0xC2, 0xB2, 0xFF, 0xE0, 0xE1, 0xE2, 0xFF, 0xDE, 0xDE, + 0xDE, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xDD, 0xDE, + 0xDE, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE3, 0xE3, + 0xE3, 0xFF, 0xE3, 0xE4, 0xE4, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE8, 0xE8, + 0xE9, 0xFF, 0xDD, 0xDB, 0xD8, 0xFF, 0x98, 0x8B, 0x6F, 0xFF, 0x81, 0x6E, 0x48, 0xFF, 0xC8, 0xC0, + 0xB4, 0xFF, 0xE3, 0xE3, 0xE2, 0xFF, 0xB6, 0xAA, 0x96, 0xFF, 0x85, 0x66, 0x35, 0xFF, 0x8A, 0x5D, + 0x1E, 0xFF, 0x9D, 0x67, 0x23, 0xFF, 0xA7, 0x6C, 0x24, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAA, 0x6E, + 0x24, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAB, 0x6D, 0x24, 0xFF, 0xAB, 0x6D, 0x24, 0xFF, 0xAB, 0x6D, + 0x24, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAB, 0x6D, 0x24, 0xFF, 0xAB, 0x6E, 0x25, 0xFF, 0xAA, 0x6C, + 0x23, 0xFF, 0xA6, 0x66, 0x1A, 0xFF, 0xA1, 0x5F, 0x13, 0xFF, 0x9E, 0x5C, 0x11, 0xFF, 0xA1, 0x61, + 0x1B, 0xFF, 0xB8, 0x88, 0x54, 0xF9, 0xD6, 0xB9, 0x99, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0xBD, 0x9F, 0x47, 0xAF, 0x7D, 0x4B, 0xF1, 0x92, 0x52, + 0x15, 0xFF, 0x90, 0x4C, 0x0C, 0xFF, 0x98, 0x56, 0x13, 0xFF, 0xA2, 0x64, 0x21, 0xFF, 0xA7, 0x6B, + 0x26, 0xFF, 0xAA, 0x6D, 0x27, 0xFF, 0xAC, 0x6F, 0x27, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, + 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAD, 0x71, + 0x28, 0xFF, 0xA6, 0x6C, 0x24, 0xFF, 0xA9, 0x81, 0x4C, 0xFF, 0xD2, 0xCC, 0xC3, 0xFF, 0xDB, 0xDC, + 0xDD, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, 0xDB, 0xDB, + 0xDB, 0xFF, 0xDB, 0xDB, 0xDC, 0xFF, 0xD8, 0xD6, 0xD3, 0xFF, 0xB4, 0xA6, 0x8F, 0xFF, 0xBD, 0xB0, + 0x99, 0xFF, 0xE0, 0xDE, 0xDC, 0xFF, 0xDF, 0xDF, 0xE0, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE4, 0xE4, + 0xE4, 0xFF, 0xE5, 0xE5, 0xE6, 0xFF, 0xE2, 0xE1, 0xE0, 0xFF, 0xAA, 0xA0, 0x8A, 0xFF, 0x80, 0x6D, + 0x45, 0xFF, 0xB9, 0xB0, 0x9E, 0xFF, 0xE2, 0xE2, 0xE3, 0xFF, 0xC8, 0xC1, 0xB6, 0xFF, 0x92, 0x79, + 0x50, 0xFF, 0x87, 0x5F, 0x22, 0xFF, 0x9B, 0x68, 0x25, 0xFF, 0xA8, 0x6E, 0x27, 0xFF, 0xAC, 0x71, + 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, + 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, + 0x28, 0xFF, 0xAD, 0x70, 0x27, 0xFF, 0xA9, 0x69, 0x1E, 0xFF, 0xA2, 0x5F, 0x12, 0xFF, 0xA2, 0x62, + 0x18, 0xFF, 0xB7, 0x86, 0x4E, 0xFE, 0xD5, 0xB6, 0x93, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0xBC, 0x9E, 0x53, 0xB0, 0x7C, 0x48, 0xF5, 0x94, 0x52, + 0x14, 0xFF, 0x97, 0x54, 0x13, 0xFF, 0xA2, 0x65, 0x24, 0xFF, 0xA8, 0x6C, 0x29, 0xFF, 0xAB, 0x6F, + 0x2A, 0xFF, 0xAE, 0x72, 0x2A, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, + 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, + 0x2B, 0xFF, 0xAF, 0x74, 0x2B, 0xFF, 0xA7, 0x6F, 0x28, 0xFF, 0xB0, 0x8F, 0x62, 0xFF, 0xD3, 0xD0, + 0xCC, 0xFF, 0xD6, 0xD6, 0xD7, 0xFF, 0xD7, 0xD7, 0xD7, 0xFF, 0xD9, 0xD9, 0xD9, 0xFF, 0xDA, 0xDA, + 0xDA, 0xFF, 0xDD, 0xDD, 0xDE, 0xFF, 0xC3, 0xBE, 0xB2, 0xFF, 0x80, 0x68, 0x3A, 0xFF, 0x8F, 0x73, + 0x44, 0xFF, 0xDA, 0xD3, 0xCA, 0xFF, 0xDF, 0xE0, 0xE2, 0xFF, 0xDF, 0xE0, 0xE1, 0xFF, 0xE2, 0xE3, + 0xE3, 0xFF, 0xE2, 0xE2, 0xE3, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xBD, 0xB7, + 0xA8, 0xFF, 0x89, 0x79, 0x54, 0xFF, 0xAF, 0xA4, 0x8E, 0xFF, 0xDE, 0xDE, 0xDD, 0xFF, 0xD5, 0xD3, + 0xCE, 0xFF, 0xA2, 0x90, 0x70, 0xFF, 0x87, 0x63, 0x2B, 0xFF, 0x99, 0x69, 0x27, 0xFF, 0xA8, 0x71, + 0x2B, 0xFF, 0xAF, 0x74, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, + 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, + 0x2B, 0xFF, 0xB1, 0x75, 0x2C, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xAA, 0x6B, 0x20, 0xFF, 0xA5, 0x64, + 0x19, 0xFF, 0xB8, 0x84, 0x4A, 0xFF, 0xD5, 0xB5, 0x91, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD9, 0xBC, 0x9D, 0x59, 0xB1, 0x7C, 0x46, 0xF7, 0x9A, 0x59, + 0x1B, 0xFF, 0xA1, 0x64, 0x26, 0xFF, 0xA8, 0x6C, 0x2C, 0xFF, 0xAC, 0x70, 0x2C, 0xFF, 0xAF, 0x73, + 0x2D, 0xFF, 0xB1, 0x76, 0x2E, 0xFF, 0xB3, 0x78, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, + 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, + 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB2, 0x78, 0x2E, 0xFF, 0xA9, 0x73, 0x2D, 0xFF, 0xB9, 0x9F, + 0x7D, 0xFF, 0xD5, 0xD5, 0xD4, 0xFF, 0xD6, 0xD7, 0xD7, 0xFF, 0xD7, 0xD7, 0xD7, 0xFF, 0xD7, 0xD7, + 0xD7, 0xFF, 0xD8, 0xD8, 0xD8, 0xFF, 0xD4, 0xD2, 0xCE, 0xFF, 0xAA, 0x9F, 0x87, 0xFF, 0xA2, 0x91, + 0x6F, 0xFF, 0xBD, 0xB1, 0x99, 0xFF, 0xD2, 0xCB, 0xBC, 0xFF, 0xC9, 0xC0, 0xAF, 0xFF, 0xCD, 0xC5, + 0xB7, 0xFF, 0xDE, 0xDB, 0xD5, 0xFF, 0xE2, 0xE1, 0xDF, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE3, 0xE3, + 0xE4, 0xFF, 0xCC, 0xC8, 0xBD, 0xFF, 0x95, 0x86, 0x66, 0xFF, 0xA7, 0x9B, 0x81, 0xFF, 0xDA, 0xD8, + 0xD5, 0xFF, 0xDC, 0xDC, 0xDB, 0xFF, 0xB3, 0xA7, 0x91, 0xFF, 0x8C, 0x6D, 0x39, 0xFF, 0x96, 0x6A, + 0x29, 0xFF, 0xA9, 0x74, 0x2E, 0xFF, 0xB1, 0x78, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, + 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, + 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB3, 0x78, 0x2F, 0xFF, 0xB1, 0x76, 0x2E, 0xFF, 0xAD, 0x6F, + 0x27, 0xFF, 0xB9, 0x86, 0x4A, 0xFF, 0xD6, 0xB6, 0x90, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDA, 0xBD, 0x9D, 0x57, 0xB5, 0x82, 0x4D, 0xF7, 0xA5, 0x69, + 0x2F, 0xFF, 0xA8, 0x6C, 0x2E, 0xFF, 0xAC, 0x71, 0x30, 0xFF, 0xB0, 0x75, 0x31, 0xFF, 0xB3, 0x78, + 0x32, 0xFF, 0xB5, 0x7B, 0x32, 0xFF, 0xB7, 0x7C, 0x33, 0xFF, 0xB7, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, + 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, + 0x33, 0xFF, 0xB7, 0x7D, 0x33, 0xFF, 0xB7, 0x7E, 0x33, 0xFF, 0xB8, 0x82, 0x3C, 0xFF, 0xB4, 0x89, + 0x4D, 0xFF, 0xC7, 0xB6, 0x9F, 0xFF, 0xD7, 0xD8, 0xD8, 0xFF, 0xD6, 0xD7, 0xD7, 0xFF, 0xD7, 0xD7, + 0xD7, 0xFF, 0xD7, 0xD7, 0xD7, 0xFF, 0xD8, 0xD8, 0xD8, 0xFF, 0xDB, 0xDC, 0xDC, 0xFF, 0xDB, 0xD9, + 0xD5, 0xFF, 0xA9, 0x99, 0x79, 0xFF, 0xAD, 0x9B, 0x78, 0xFF, 0xD1, 0xCA, 0xB9, 0xFF, 0xBB, 0xB0, + 0x99, 0xFF, 0x9D, 0x89, 0x63, 0xFF, 0xAE, 0xA1, 0x85, 0xFF, 0xDF, 0xDE, 0xDC, 0xFF, 0xE0, 0xE0, + 0xE0, 0xFF, 0xE2, 0xE2, 0xE3, 0xFF, 0xD5, 0xD3, 0xCD, 0xFF, 0xA0, 0x95, 0x79, 0xFF, 0xA3, 0x96, + 0x79, 0xFF, 0xD6, 0xD4, 0xCF, 0xFF, 0xE0, 0xE0, 0xE2, 0xFF, 0xC5, 0xBD, 0xAF, 0xFF, 0x95, 0x7B, + 0x4D, 0xFF, 0x96, 0x6C, 0x2D, 0xFF, 0xAB, 0x77, 0x32, 0xFF, 0xB5, 0x7C, 0x33, 0xFF, 0xB7, 0x7D, + 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, + 0x33, 0xFF, 0xB7, 0x7D, 0x33, 0xFF, 0xB7, 0x7C, 0x33, 0xFF, 0xB5, 0x7B, 0x32, 0xFF, 0xB5, 0x7C, + 0x37, 0xFF, 0xC0, 0x90, 0x57, 0xFF, 0xD7, 0xB7, 0x92, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDD, 0xC0, 0xA1, 0x4F, 0xBF, 0x90, 0x5E, 0xF4, 0xAD, 0x74, + 0x3A, 0xFF, 0xAC, 0x71, 0x32, 0xFF, 0xB0, 0x76, 0x34, 0xFF, 0xB4, 0x7A, 0x35, 0xFF, 0xB7, 0x7D, + 0x36, 0xFF, 0xB8, 0x7F, 0x36, 0xFF, 0xBA, 0x80, 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBA, 0x81, + 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBA, 0x81, + 0x37, 0xFF, 0xBB, 0x82, 0x38, 0xFF, 0xC0, 0x8B, 0x46, 0xFF, 0xC4, 0x93, 0x53, 0xFF, 0xC0, 0x91, + 0x52, 0xFF, 0xBA, 0x93, 0x5E, 0xFF, 0xD0, 0xC4, 0xB5, 0xFF, 0xDB, 0xDB, 0xDC, 0xFF, 0xDA, 0xDA, + 0xDA, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xD9, 0xD9, 0xD9, 0xFF, 0xDD, 0xDE, + 0xDF, 0xFF, 0xC0, 0xB9, 0xA6, 0xFF, 0xAA, 0x9B, 0x7B, 0xFF, 0xD6, 0xD0, 0xC4, 0xFF, 0xDF, 0xDD, + 0xD8, 0xFF, 0xA3, 0x95, 0x74, 0xFF, 0xAA, 0x9F, 0x85, 0xFF, 0xDA, 0xDA, 0xD8, 0xFF, 0xDD, 0xDD, + 0xDE, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xDC, 0xDB, 0xD8, 0xFF, 0xAE, 0xA5, + 0x8E, 0xFF, 0xA2, 0x95, 0x78, 0xFF, 0xD3, 0xD0, 0xC8, 0xFF, 0xE1, 0xE2, 0xE3, 0xFF, 0xD3, 0xCE, + 0xC4, 0xFF, 0xA3, 0x8B, 0x61, 0xFF, 0x9F, 0x74, 0x34, 0xFF, 0xB3, 0x7D, 0x36, 0xFF, 0xBA, 0x81, + 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBA, 0x81, + 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBA, 0x80, 0x37, 0xFF, 0xB8, 0x7F, 0x36, 0xFF, 0xB9, 0x81, + 0x3D, 0xFF, 0xC8, 0x9B, 0x66, 0xFF, 0xDB, 0xBD, 0x9A, 0x7D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xC3, 0xA4, 0x40, 0xC4, 0x99, 0x68, 0xEF, 0xB2, 0x7A, + 0x40, 0xFF, 0xB0, 0x75, 0x36, 0xFF, 0xB4, 0x7A, 0x38, 0xFF, 0xB7, 0x7E, 0x39, 0xFF, 0xBA, 0x81, + 0x3A, 0xFF, 0xBC, 0x83, 0x3A, 0xFF, 0xBD, 0x84, 0x3B, 0xFF, 0xBE, 0x85, 0x3B, 0xFF, 0xBD, 0x85, + 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBE, 0x85, + 0x3C, 0xFF, 0xC3, 0x8F, 0x4B, 0xFF, 0xC9, 0x98, 0x5A, 0xFF, 0xC9, 0x99, 0x5A, 0xFF, 0xC8, 0x98, + 0x5A, 0xFF, 0xC2, 0x95, 0x58, 0xFF, 0xC0, 0x9E, 0x6F, 0xFF, 0xD8, 0xD1, 0xC5, 0xFF, 0xDE, 0xDF, + 0xE0, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xE0, 0xE0, + 0xDF, 0xFF, 0xC5, 0xBF, 0xB0, 0xFF, 0xD6, 0xD2, 0xC8, 0xFF, 0xB3, 0xA8, 0x8D, 0xFF, 0xD3, 0xCE, + 0xC2, 0xFF, 0xDF, 0xDE, 0xDD, 0xFF, 0xDB, 0xDB, 0xD9, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDA, 0xDA, + 0xDA, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE2, 0xE2, + 0xE1, 0xFF, 0xBD, 0xB7, 0xA6, 0xFF, 0xA4, 0x99, 0x7C, 0xFF, 0xD1, 0xCD, 0xC2, 0xFF, 0xE2, 0xE3, + 0xE5, 0xFF, 0xD9, 0xD4, 0xCB, 0xFF, 0xA6, 0x84, 0x4E, 0xFF, 0xB1, 0x7E, 0x38, 0xFF, 0xBD, 0x84, + 0x3B, 0xFF, 0xBE, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBD, 0x85, + 0x3B, 0xFF, 0xBE, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBC, 0x83, 0x3A, 0xFF, 0xBD, 0x87, + 0x42, 0xFF, 0xCD, 0xA2, 0x6E, 0xFD, 0xDE, 0xC1, 0x9E, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xC4, 0xA4, 0x2B, 0xCB, 0xA0, 0x70, 0xE5, 0xB8, 0x81, + 0x47, 0xFF, 0xB4, 0x7A, 0x3A, 0xFF, 0xB7, 0x7E, 0x3C, 0xFF, 0xBB, 0x82, 0x3D, 0xFF, 0xBD, 0x85, + 0x3D, 0xFF, 0xBF, 0x87, 0x3E, 0xFF, 0xC0, 0x89, 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC1, 0x89, + 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC5, 0x92, + 0x4D, 0xFF, 0xCC, 0x9E, 0x61, 0xFF, 0xCD, 0x9E, 0x62, 0xFF, 0xCD, 0x9E, 0x61, 0xFF, 0xCD, 0x9E, + 0x61, 0xFF, 0xCC, 0x9E, 0x61, 0xFF, 0xC5, 0x9A, 0x5E, 0xFF, 0xC7, 0xA9, 0x7F, 0xFF, 0xDE, 0xDA, + 0xD4, 0xFF, 0xE3, 0xE3, 0xE4, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE3, 0xE3, 0xE4, 0xFF, 0xE3, 0xE2, + 0xE0, 0xFF, 0xC4, 0xBE, 0xAC, 0xFF, 0xE5, 0xE4, 0xE2, 0xFF, 0xD9, 0xD6, 0xCE, 0xFF, 0xB3, 0xA7, + 0x8C, 0xFF, 0xD4, 0xCF, 0xC4, 0xFF, 0xDF, 0xDF, 0xE0, 0xFF, 0xDD, 0xDD, 0xDC, 0xFF, 0xDD, 0xDD, + 0xDD, 0xFF, 0xDC, 0xDC, 0xDC, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xE4, 0xE4, + 0xE4, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xCD, 0xC8, 0xBC, 0xFF, 0xAA, 0xA1, 0x86, 0xFF, 0xD1, 0xCD, + 0xC2, 0xFF, 0xE5, 0xE3, 0xE0, 0xFF, 0xB3, 0x93, 0x62, 0xFF, 0xB4, 0x81, 0x3B, 0xFF, 0xC0, 0x89, + 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC1, 0x89, + 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC0, 0x89, 0x3F, 0xFF, 0xBF, 0x87, 0x3E, 0xFF, 0xC1, 0x8D, + 0x4A, 0xFF, 0xD1, 0xA9, 0x77, 0xF7, 0xE2, 0xCA, 0xA9, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE3, 0xCA, 0xAA, 0x17, 0xD0, 0xA8, 0x7B, 0xCE, 0xBE, 0x8A, + 0x51, 0xFF, 0xB8, 0x7F, 0x3F, 0xFF, 0xBB, 0x82, 0x3F, 0xFF, 0xBE, 0x86, 0x41, 0xFF, 0xC1, 0x89, + 0x42, 0xFF, 0xC2, 0x8B, 0x42, 0xFF, 0xC3, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, + 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC7, 0x91, 0x4A, 0xFF, 0xCE, 0xA0, + 0x63, 0xFF, 0xD0, 0xA3, 0x68, 0xFF, 0xD0, 0xA3, 0x68, 0xFF, 0xD0, 0xA3, 0x68, 0xFF, 0xD0, 0xA3, + 0x68, 0xFF, 0xD0, 0xA3, 0x68, 0xFF, 0xCF, 0xA2, 0x67, 0xFF, 0xC8, 0x9E, 0x65, 0xFF, 0xCD, 0xB5, + 0x91, 0xFF, 0xE4, 0xE2, 0xDF, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE6, 0xE6, 0xE7, 0xFF, 0xE7, 0xE7, + 0xE6, 0xFF, 0xC0, 0xB6, 0xA0, 0xFF, 0xBB, 0xAD, 0x90, 0xFF, 0xD9, 0xD4, 0xCB, 0xFF, 0xD6, 0xD2, + 0xC8, 0xFF, 0xB6, 0xA8, 0x8A, 0xFF, 0xC0, 0xB2, 0x97, 0xFF, 0xD2, 0xCC, 0xBF, 0xFF, 0xDF, 0xE0, + 0xE0, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xE3, 0xE3, + 0xE3, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xD9, 0xD7, 0xCF, 0xFF, 0xBB, 0xB2, + 0x9B, 0xFF, 0xD7, 0xCC, 0xB9, 0xFF, 0xB6, 0x90, 0x57, 0xFF, 0xBC, 0x88, 0x41, 0xFF, 0xC3, 0x8D, + 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, + 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC3, 0x8C, 0x43, 0xFF, 0xC2, 0x8B, 0x42, 0xFF, 0xC7, 0x94, + 0x53, 0xFF, 0xD6, 0xB0, 0x81, 0xED, 0xE8, 0xD2, 0xB5, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0xEC, 0xDE, 0x09, 0xD6, 0xB1, 0x86, 0xAC, 0xC4, 0x93, + 0x5C, 0xFF, 0xBC, 0x84, 0x45, 0xFF, 0xBF, 0x87, 0x44, 0xFF, 0xC2, 0x8B, 0x46, 0xFF, 0xC4, 0x8D, + 0x46, 0xFF, 0xC5, 0x8F, 0x47, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC8, 0x91, + 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xCE, 0x9F, 0x5F, 0xFF, 0xD3, 0xA9, + 0x6F, 0xFF, 0xD3, 0xA8, 0x6E, 0xFF, 0xD3, 0xA8, 0x6E, 0xFF, 0xD3, 0xA8, 0x6E, 0xFF, 0xD3, 0xA8, + 0x6E, 0xFF, 0xD3, 0xA8, 0x6E, 0xFF, 0xD3, 0xA8, 0x6E, 0xFF, 0xD2, 0xA8, 0x6E, 0xFF, 0xCB, 0xA4, + 0x6D, 0xFF, 0xD4, 0xC0, 0xA3, 0xFF, 0xE8, 0xE7, 0xE6, 0xFF, 0xE9, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, + 0xE9, 0xFF, 0xB8, 0xB0, 0x98, 0xFF, 0x9C, 0x8C, 0x64, 0xFF, 0xC4, 0xBB, 0xA8, 0xFF, 0xE3, 0xE2, + 0xE0, 0xFF, 0xB0, 0xA3, 0x85, 0xFF, 0xA2, 0x8E, 0x62, 0xFF, 0xC3, 0xB9, 0xA5, 0xFF, 0xE2, 0xE2, + 0xE3, 0xFF, 0xE1, 0xE1, 0xE2, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE2, 0xE2, + 0xE2, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xEA, 0xEA, 0xEB, 0xFF, 0xE6, 0xE3, + 0xDE, 0xFF, 0xC0, 0xAC, 0x88, 0xFF, 0xB4, 0x89, 0x49, 0xFF, 0xC1, 0x8E, 0x46, 0xFF, 0xC7, 0x91, + 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC8, 0x91, + 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC7, 0x90, 0x48, 0xFF, 0xCD, 0x9D, + 0x5F, 0xFF, 0xDB, 0xB8, 0x8C, 0xD5, 0xE8, 0xD3, 0xB7, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDB, 0xB8, 0x8D, 0x7E, 0xCD, 0x9F, + 0x69, 0xFF, 0xC2, 0x8B, 0x4D, 0xFF, 0xC3, 0x8B, 0x48, 0xFF, 0xC5, 0x8F, 0x4A, 0xFF, 0xC8, 0x92, + 0x4B, 0xFF, 0xCA, 0x94, 0x4B, 0xFF, 0xCC, 0x95, 0x4C, 0xFF, 0xCC, 0x96, 0x4C, 0xFF, 0xCC, 0x96, + 0x4C, 0xFF, 0xCC, 0x96, 0x4B, 0xFF, 0xCE, 0x9B, 0x55, 0xFF, 0xD6, 0xAC, 0x72, 0xFF, 0xD7, 0xAE, + 0x75, 0xFF, 0xD7, 0xAE, 0x75, 0xFF, 0xD7, 0xAE, 0x75, 0xFF, 0xD7, 0xAE, 0x75, 0xFF, 0xD7, 0xAE, + 0x75, 0xFF, 0xD7, 0xAE, 0x75, 0xFF, 0xD7, 0xAE, 0x75, 0xFF, 0xD7, 0xAE, 0x75, 0xFF, 0xD5, 0xAC, + 0x74, 0xFF, 0xCF, 0xAA, 0x77, 0xFF, 0xDB, 0xCC, 0xB4, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEC, 0xEC, + 0xED, 0xFF, 0xE1, 0xDF, 0xDA, 0xFF, 0xD1, 0xCD, 0xC1, 0xFF, 0xE3, 0xE2, 0xDE, 0xFF, 0xE7, 0xE6, + 0xE6, 0xFF, 0xD5, 0xD2, 0xC9, 0xFF, 0xBD, 0xB6, 0xA2, 0xFF, 0xC2, 0xBD, 0xAC, 0xFF, 0xE5, 0xE5, + 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE6, 0xE6, + 0xE6, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xEC, 0xEC, 0xED, 0xFF, 0xDD, 0xDA, + 0xD0, 0xFF, 0xB9, 0xA9, 0x85, 0xFF, 0xB8, 0x96, 0x5F, 0xFF, 0xBA, 0x8D, 0x48, 0xFF, 0xC4, 0x92, + 0x4B, 0xFF, 0xCA, 0x95, 0x4C, 0xFF, 0xCB, 0x96, 0x4C, 0xFF, 0xCC, 0x96, 0x4C, 0xFF, 0xCC, 0x96, + 0x4C, 0xFF, 0xCC, 0x96, 0x4C, 0xFF, 0xCB, 0x95, 0x4C, 0xFF, 0xCB, 0x96, 0x4F, 0xFF, 0xD4, 0xA8, + 0x6D, 0xFF, 0xDC, 0xBC, 0x93, 0xAD, 0xC5, 0xBC, 0xAE, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE3, 0xC5, 0xA0, 0x48, 0xD4, 0xAA, + 0x76, 0xF2, 0xC9, 0x94, 0x57, 0xFF, 0xC7, 0x8F, 0x4C, 0xFF, 0xCA, 0x93, 0x4E, 0xFF, 0xCC, 0x96, + 0x4F, 0xFF, 0xCE, 0x98, 0x4F, 0xFF, 0xCF, 0x9A, 0x50, 0xFF, 0xD0, 0x9A, 0x50, 0xFF, 0xCF, 0x9A, + 0x50, 0xFF, 0xD0, 0x9A, 0x50, 0xFF, 0xD5, 0xA7, 0x66, 0xFF, 0xDB, 0xB3, 0x7C, 0xFF, 0xDB, 0xB3, + 0x7B, 0xFF, 0xDB, 0xB3, 0x7B, 0xFF, 0xDB, 0xB3, 0x7B, 0xFF, 0xDB, 0xB3, 0x7B, 0xFF, 0xDB, 0xB3, + 0x7B, 0xFF, 0xDB, 0xB3, 0x7B, 0xFF, 0xDB, 0xB3, 0x7B, 0xFF, 0xDB, 0xB3, 0x7B, 0xFF, 0xDB, 0xB3, + 0x7B, 0xFF, 0xD8, 0xB1, 0x7A, 0xFF, 0xD2, 0xB1, 0x80, 0xFF, 0xDF, 0xD4, 0xC0, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xEF, 0xEF, 0xF0, 0xFF, 0xF0, 0xF0, 0xF1, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEB, 0xEB, + 0xEB, 0xFF, 0xEB, 0xEB, 0xEC, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE4, 0xE4, 0xE3, 0xFF, 0xE8, 0xE8, + 0xE8, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE9, 0xE9, + 0xE9, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xEF, 0xEF, 0xED, 0xFF, 0xE6, 0xE5, + 0xDF, 0xFF, 0xC3, 0xBB, 0xA2, 0xFF, 0xC7, 0xB8, 0x99, 0xFF, 0xB7, 0x99, 0x64, 0xFF, 0xB7, 0x8E, + 0x4B, 0xFF, 0xC5, 0x96, 0x4F, 0xFF, 0xCD, 0x99, 0x50, 0xFF, 0xCF, 0x9A, 0x50, 0xFF, 0xD0, 0x9A, + 0x50, 0xFF, 0xD0, 0x9A, 0x50, 0xFF, 0xCF, 0x99, 0x50, 0xFF, 0xD0, 0x9D, 0x58, 0xFF, 0xDB, 0xB2, + 0x7D, 0xFE, 0xDF, 0xC2, 0x9C, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA, 0xD3, 0xB3, 0x1A, 0xDB, 0xB5, + 0x85, 0xCF, 0xD0, 0x9E, 0x63, 0xFF, 0xCB, 0x94, 0x52, 0xFF, 0xCD, 0x97, 0x51, 0xFF, 0xCF, 0x9A, + 0x52, 0xFF, 0xD1, 0x9C, 0x53, 0xFF, 0xD2, 0x9E, 0x54, 0xFF, 0xD3, 0x9F, 0x54, 0xFF, 0xD3, 0x9F, + 0x54, 0xFF, 0xD4, 0xA0, 0x56, 0xFF, 0xDB, 0xB2, 0x76, 0xFF, 0xDE, 0xB9, 0x82, 0xFF, 0xDE, 0xB8, + 0x81, 0xFF, 0xDE, 0xB8, 0x81, 0xFF, 0xDE, 0xB8, 0x81, 0xFF, 0xDE, 0xB8, 0x81, 0xFF, 0xDE, 0xB8, + 0x81, 0xFF, 0xDE, 0xB8, 0x81, 0xFF, 0xDE, 0xB8, 0x81, 0xFF, 0xDE, 0xB8, 0x81, 0xFF, 0xDE, 0xB8, + 0x81, 0xFF, 0xDE, 0xB8, 0x81, 0xFF, 0xDB, 0xB6, 0x80, 0xFF, 0xD6, 0xB7, 0x89, 0xFF, 0xE4, 0xDB, + 0xCC, 0xFF, 0xF0, 0xF0, 0xF1, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xEF, 0xEF, + 0xEF, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEB, 0xEB, + 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEB, + 0xEB, 0xFF, 0xED, 0xEC, 0xEC, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xEC, 0xEC, 0xE9, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xEB, 0xEA, 0xE7, 0xFF, 0xD3, 0xCE, 0xBC, 0xFF, 0xD2, 0xC9, 0xB2, 0xFF, 0xBE, 0xA5, + 0x77, 0xFF, 0xBD, 0x94, 0x52, 0xFF, 0xCD, 0x9C, 0x53, 0xFF, 0xD2, 0x9F, 0x54, 0xFF, 0xD3, 0x9F, + 0x54, 0xFF, 0xD3, 0x9E, 0x54, 0xFF, 0xD2, 0x9E, 0x55, 0xFF, 0xD6, 0xA6, 0x65, 0xFF, 0xE0, 0xBC, + 0x8C, 0xEC, 0xD8, 0xC1, 0xA2, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x02, 0xE1, 0xBF, + 0x91, 0x8D, 0xD7, 0xAA, 0x73, 0xFF, 0xD0, 0x9B, 0x5A, 0xFF, 0xD1, 0x9B, 0x55, 0xFF, 0xD3, 0x9E, + 0x57, 0xFF, 0xD4, 0xA0, 0x58, 0xFF, 0xD5, 0xA2, 0x58, 0xFF, 0xD6, 0xA3, 0x58, 0xFF, 0xD6, 0xA3, + 0x58, 0xFF, 0xD8, 0xA6, 0x5F, 0xFF, 0xE0, 0xBA, 0x82, 0xFF, 0xE1, 0xBD, 0x88, 0xFF, 0xE1, 0xBD, + 0x87, 0xFF, 0xE1, 0xBD, 0x87, 0xFF, 0xE1, 0xBD, 0x87, 0xFF, 0xE1, 0xBD, 0x87, 0xFF, 0xE1, 0xBD, + 0x87, 0xFF, 0xE1, 0xBD, 0x87, 0xFF, 0xE1, 0xBD, 0x87, 0xFF, 0xE1, 0xBD, 0x87, 0xFF, 0xE1, 0xBD, + 0x87, 0xFF, 0xE1, 0xBD, 0x87, 0xFF, 0xE1, 0xBD, 0x87, 0xFF, 0xDE, 0xBA, 0x85, 0xFF, 0xD9, 0xBD, + 0x92, 0xFF, 0xE7, 0xE0, 0xD3, 0xFF, 0xF2, 0xF2, 0xF3, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF1, 0xF1, + 0xF1, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xED, + 0xED, 0xFF, 0xE7, 0xE7, 0xE2, 0xFF, 0xEB, 0xEB, 0xE8, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF0, 0xEF, 0xED, 0xFF, 0xDC, 0xD8, 0xCC, 0xFF, 0xE0, 0xD8, + 0xC7, 0xFF, 0xC1, 0xA0, 0x67, 0xFF, 0xCD, 0x9E, 0x56, 0xFF, 0xD5, 0xA3, 0x58, 0xFF, 0xD6, 0xA3, + 0x58, 0xFF, 0xD6, 0xA3, 0x58, 0xFF, 0xD6, 0xA4, 0x5C, 0xFF, 0xDD, 0xB2, 0x76, 0xFF, 0xE3, 0xC4, + 0x98, 0xBB, 0xD5, 0xC3, 0xAE, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0xCB, + 0xA1, 0x41, 0xDE, 0xB6, 0x82, 0xEC, 0xD6, 0xA4, 0x67, 0xFF, 0xD4, 0x9F, 0x5B, 0xFF, 0xD6, 0xA1, + 0x5B, 0xFF, 0xD7, 0xA4, 0x5C, 0xFF, 0xD9, 0xA6, 0x5D, 0xFF, 0xDA, 0xA7, 0x5D, 0xFF, 0xDA, 0xA7, + 0x5C, 0xFF, 0xDC, 0xAD, 0x67, 0xFF, 0xE4, 0xC0, 0x8B, 0xFF, 0xE5, 0xC1, 0x8E, 0xFF, 0xE5, 0xC1, + 0x8E, 0xFF, 0xE5, 0xC1, 0x8E, 0xFF, 0xE5, 0xC1, 0x8E, 0xFF, 0xE5, 0xC1, 0x8E, 0xFF, 0xE5, 0xC1, + 0x8E, 0xFF, 0xE5, 0xC1, 0x8E, 0xFF, 0xE5, 0xC1, 0x8E, 0xFF, 0xE5, 0xC1, 0x8E, 0xFF, 0xE5, 0xC1, + 0x8E, 0xFF, 0xE5, 0xC1, 0x8E, 0xFF, 0xE5, 0xC1, 0x8E, 0xFF, 0xE4, 0xC1, 0x8E, 0xFF, 0xE0, 0xBF, + 0x8C, 0xFF, 0xDC, 0xC3, 0x9A, 0xFF, 0xEA, 0xE4, 0xD9, 0xFF, 0xF4, 0xF5, 0xF5, 0xFF, 0xF3, 0xF3, + 0xF3, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF0, 0xF0, + 0xF0, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF1, 0xF1, 0xF2, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xEA, 0xEA, + 0xE6, 0xFF, 0xED, 0xED, 0xEB, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF1, 0xF1, 0xF2, 0xFF, 0xF2, 0xF2, + 0xF1, 0xFF, 0xE0, 0xDD, 0xD2, 0xFF, 0xEE, 0xED, 0xE9, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xE9, 0xE3, + 0xD7, 0xFF, 0xC9, 0xA7, 0x6D, 0xFF, 0xD2, 0xA3, 0x5B, 0xFF, 0xD9, 0xA7, 0x5D, 0xFF, 0xDA, 0xA7, + 0x5D, 0xFF, 0xDA, 0xA7, 0x5D, 0xFF, 0xDB, 0xAC, 0x67, 0xFF, 0xE3, 0xBE, 0x88, 0xFC, 0xE7, 0xCC, + 0xA3, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA, 0xD7, + 0xBA, 0x0C, 0xE3, 0xBF, 0x8F, 0xAE, 0xDD, 0xB1, 0x77, 0xFF, 0xD8, 0xA5, 0x62, 0xFF, 0xD9, 0xA5, + 0x5F, 0xFF, 0xDA, 0xA8, 0x60, 0xFF, 0xDB, 0xAA, 0x61, 0xFF, 0xDC, 0xAB, 0x61, 0xFF, 0xDD, 0xAB, + 0x60, 0xFF, 0xDF, 0xB2, 0x6D, 0xFF, 0xE8, 0xC5, 0x92, 0xFF, 0xE8, 0xC7, 0x94, 0xFF, 0xE8, 0xC7, + 0x94, 0xFF, 0xE8, 0xC7, 0x94, 0xFF, 0xE8, 0xC7, 0x94, 0xFF, 0xE8, 0xC7, 0x94, 0xFF, 0xE8, 0xC7, + 0x94, 0xFF, 0xE8, 0xC7, 0x94, 0xFF, 0xE8, 0xC7, 0x94, 0xFF, 0xE8, 0xC7, 0x94, 0xFF, 0xE8, 0xC7, + 0x94, 0xFF, 0xE8, 0xC7, 0x94, 0xFF, 0xE8, 0xC7, 0x94, 0xFF, 0xE8, 0xC7, 0x94, 0xFF, 0xE7, 0xC7, + 0x94, 0xFF, 0xE3, 0xC3, 0x91, 0xFF, 0xE0, 0xC9, 0xA0, 0xFF, 0xED, 0xE7, 0xDC, 0xFF, 0xF6, 0xF6, + 0xF7, 0xFF, 0xF5, 0xF5, 0xF5, 0xFF, 0xF4, 0xF4, 0xF4, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF3, 0xF3, + 0xF3, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF4, 0xF3, 0xF3, 0xFF, 0xF0, 0xF0, 0xEE, 0xFF, 0xF2, 0xF2, + 0xF0, 0xFF, 0xF4, 0xF4, 0xF4, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF5, 0xF5, 0xF5, 0xFF, 0xE3, 0xE2, + 0xD9, 0xFF, 0xCB, 0xC7, 0xB3, 0xFF, 0xF2, 0xF1, 0xEE, 0xFF, 0xF3, 0xF2, 0xF0, 0xFF, 0xD9, 0xC5, + 0xA1, 0xFF, 0xCE, 0xA4, 0x61, 0xFF, 0xDA, 0xAA, 0x61, 0xFF, 0xDD, 0xAB, 0x61, 0xFF, 0xDD, 0xAB, + 0x61, 0xFF, 0xDD, 0xAC, 0x64, 0xFF, 0xE2, 0xB7, 0x79, 0xFF, 0xE8, 0xC8, 0x99, 0xD5, 0xE3, 0xCD, + 0xAD, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xE2, 0xC3, 0x99, 0x4F, 0xE4, 0xBC, 0x87, 0xF2, 0xDD, 0xAE, 0x6F, 0xFF, 0xDC, 0xA9, + 0x63, 0xFF, 0xDD, 0xAB, 0x63, 0xFF, 0xDE, 0xAD, 0x65, 0xFF, 0xDF, 0xAE, 0x65, 0xFF, 0xDF, 0xAE, + 0x64, 0xFF, 0xE2, 0xB5, 0x70, 0xFF, 0xEA, 0xCA, 0x96, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xEA, 0xCB, + 0x99, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xEA, 0xCB, + 0x99, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xEA, 0xCB, + 0x99, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xEA, 0xCB, + 0x99, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xE6, 0xC8, 0x97, 0xFF, 0xE3, 0xCC, 0xA5, 0xFF, 0xEE, 0xE7, + 0xDC, 0xFF, 0xF7, 0xF7, 0xF8, 0xFF, 0xF7, 0xF7, 0xF7, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xF6, 0xF6, + 0xF7, 0xFF, 0xF4, 0xF3, 0xF1, 0xFF, 0xF5, 0xF4, 0xF2, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xF6, 0xF6, + 0xF6, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xF7, 0xF7, 0xF7, 0xFF, 0xF0, 0xEF, + 0xEC, 0xFF, 0xF2, 0xF1, 0xEE, 0xFF, 0xF8, 0xF8, 0xF7, 0xFF, 0xDF, 0xCF, 0xAF, 0xFF, 0xCD, 0xA6, + 0x65, 0xFF, 0xDA, 0xAC, 0x64, 0xFF, 0xDF, 0xAF, 0x65, 0xFF, 0xE0, 0xAF, 0x65, 0xFF, 0xE0, 0xAF, + 0x66, 0xFF, 0xE1, 0xB4, 0x6F, 0xFF, 0xE8, 0xC3, 0x8D, 0xFE, 0xE9, 0xCE, 0xA4, 0x7C, 0x36, 0xA7, + 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xDF, 0xCB, 0xAE, 0x0C, 0xE8, 0xC5, 0x94, 0xA8, 0xE4, 0xB9, 0x81, 0xFF, 0xE0, 0xAE, + 0x6C, 0xFF, 0xDF, 0xAE, 0x67, 0xFF, 0xE1, 0xB0, 0x68, 0xFF, 0xE2, 0xB2, 0x69, 0xFF, 0xE2, 0xB2, + 0x68, 0xFF, 0xE4, 0xB7, 0x71, 0xFF, 0xEB, 0xCC, 0x99, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xEC, 0xCE, + 0x9F, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xEC, 0xCE, + 0x9F, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xEC, 0xCE, + 0x9F, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xEC, 0xCE, + 0x9F, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xE9, 0xCC, 0x9D, 0xFF, 0xE5, 0xCE, + 0xA6, 0xFF, 0xEE, 0xE6, 0xD6, 0xFF, 0xF8, 0xF8, 0xF7, 0xFF, 0xF9, 0xFA, 0xFB, 0xFF, 0xF3, 0xF0, + 0xEA, 0xFF, 0xE2, 0xD4, 0xB8, 0xFF, 0xE7, 0xDB, 0xC3, 0xFF, 0xF7, 0xF6, 0xF3, 0xFF, 0xF8, 0xF9, + 0xF9, 0xFF, 0xF9, 0xF9, 0xF9, 0xFF, 0xF1, 0xF0, 0xEB, 0xFF, 0xF0, 0xEF, 0xEA, 0xFF, 0xF9, 0xFA, + 0xFA, 0xFF, 0xFA, 0xFA, 0xF9, 0xFF, 0xEB, 0xE2, 0xCF, 0xFF, 0xD5, 0xB4, 0x7A, 0xFF, 0xDC, 0xAF, + 0x67, 0xFF, 0xE1, 0xB3, 0x69, 0xFF, 0xE3, 0xB3, 0x69, 0xFF, 0xE2, 0xB3, 0x69, 0xFF, 0xE3, 0xB4, + 0x6D, 0xFF, 0xE7, 0xBF, 0x82, 0xFF, 0xEC, 0xCD, 0x9D, 0xCF, 0xE7, 0xD2, 0xB1, 0x22, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0xCB, 0xA0, 0x3B, 0xEA, 0xC4, 0x90, 0xE3, 0xE5, 0xB9, + 0x7C, 0xFF, 0xE2, 0xB2, 0x6D, 0xFF, 0xE3, 0xB3, 0x6C, 0xFF, 0xE4, 0xB5, 0x6D, 0xFF, 0xE5, 0xB6, + 0x6D, 0xFF, 0xE6, 0xB8, 0x71, 0xFF, 0xED, 0xCD, 0x98, 0xFF, 0xF0, 0xD3, 0xA5, 0xFF, 0xEF, 0xD2, + 0xA4, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEF, 0xD2, + 0xA4, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEF, 0xD2, + 0xA4, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEF, 0xD2, + 0xA4, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEC, 0xD0, + 0xA2, 0xFF, 0xE9, 0xD0, 0xA5, 0xFF, 0xED, 0xDE, 0xC3, 0xFF, 0xF1, 0xE8, 0xD7, 0xFF, 0xE7, 0xD4, + 0xB2, 0xFF, 0xE6, 0xCD, 0xA0, 0xFF, 0xE7, 0xCE, 0xA2, 0xFF, 0xEC, 0xDD, 0xC0, 0xFF, 0xF8, 0xF6, + 0xF1, 0xFF, 0xFA, 0xFA, 0xFA, 0xFF, 0xDC, 0xDA, 0xCA, 0xFF, 0xE7, 0xE6, 0xDC, 0xFF, 0xFB, 0xFB, + 0xFB, 0xFF, 0xEF, 0xE7, 0xD7, 0xFF, 0xE2, 0xCB, 0xA1, 0xFF, 0xE1, 0xB8, 0x76, 0xFF, 0xE4, 0xB6, + 0x6D, 0xFF, 0xE5, 0xB7, 0x6E, 0xFF, 0xE5, 0xB7, 0x6E, 0xFF, 0xE5, 0xB7, 0x6F, 0xFF, 0xE7, 0xBD, + 0x7C, 0xFF, 0xED, 0xCB, 0x96, 0xF6, 0xEC, 0xD3, 0xA9, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0xDD, 0xE8, 0x02, 0xEC, 0xCC, 0x9C, 0x79, 0xEA, 0xC4, + 0x8D, 0xFB, 0xE6, 0xBA, 0x7A, 0xFF, 0xE6, 0xB6, 0x70, 0xFF, 0xE6, 0xB7, 0x70, 0xFF, 0xE7, 0xB9, + 0x71, 0xFF, 0xE7, 0xB9, 0x71, 0xFF, 0xED, 0xCA, 0x91, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, + 0xA9, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, + 0xA9, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, + 0xA9, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, + 0xA9, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, + 0xA8, 0xFF, 0xF0, 0xD5, 0xA8, 0xFF, 0xEE, 0xD3, 0xA7, 0xFF, 0xED, 0xD3, 0xA8, 0xFF, 0xEE, 0xD3, + 0xA7, 0xFF, 0xF0, 0xD5, 0xA8, 0xFF, 0xF0, 0xD5, 0xA8, 0xFF, 0xEB, 0xD2, 0xA7, 0xFF, 0xED, 0xDC, + 0xBC, 0xFF, 0xF8, 0xF5, 0xED, 0xFF, 0xF8, 0xF8, 0xF6, 0xFF, 0xFB, 0xFB, 0xFA, 0xFF, 0xF2, 0xEB, + 0xDD, 0xFF, 0xE5, 0xD2, 0xAD, 0xFF, 0xE9, 0xCC, 0x9A, 0xFF, 0xE7, 0xBB, 0x74, 0xFF, 0xE8, 0xBA, + 0x71, 0xFF, 0xE8, 0xBA, 0x71, 0xFF, 0xE8, 0xBA, 0x72, 0xFF, 0xE9, 0xBE, 0x79, 0xFF, 0xED, 0xCA, + 0x91, 0xFF, 0xEF, 0xD3, 0xA5, 0xA5, 0xE9, 0xD8, 0xBC, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA, 0xD3, 0xAE, 0x13, 0xEE, 0xCD, + 0x9A, 0xAD, 0xEC, 0xC5, 0x8D, 0xFF, 0xE9, 0xBC, 0x7B, 0xFF, 0xE8, 0xBA, 0x74, 0xFF, 0xE9, 0xBB, + 0x74, 0xFF, 0xE9, 0xBC, 0x73, 0xFF, 0xEC, 0xC4, 0x85, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD9, + 0xAD, 0xFF, 0xF2, 0xD8, 0xAD, 0xFF, 0xF2, 0xD8, 0xAD, 0xFF, 0xF2, 0xD9, 0xAD, 0xFF, 0xF2, 0xD9, + 0xAD, 0xFF, 0xF2, 0xD9, 0xAD, 0xFF, 0xF2, 0xD9, 0xAD, 0xFF, 0xF2, 0xD9, 0xAD, 0xFF, 0xF2, 0xD9, + 0xAD, 0xFF, 0xF2, 0xD9, 0xAD, 0xFF, 0xF2, 0xD9, 0xAD, 0xFF, 0xF2, 0xD9, 0xAD, 0xFF, 0xF2, 0xD9, + 0xAD, 0xFF, 0xF2, 0xD9, 0xAD, 0xFF, 0xF2, 0xD9, 0xAD, 0xFF, 0xF2, 0xD8, 0xAD, 0xFF, 0xF2, 0xD9, + 0xAD, 0xFF, 0xF2, 0xD9, 0xAD, 0xFF, 0xF2, 0xD8, 0xAD, 0xFF, 0xF2, 0xD8, 0xAD, 0xFF, 0xF2, 0xD9, + 0xAD, 0xFF, 0xF2, 0xD9, 0xAD, 0xFF, 0xF2, 0xD9, 0xAD, 0xFF, 0xF2, 0xD8, 0xAD, 0xFF, 0xEE, 0xD6, + 0xAB, 0xFF, 0xEE, 0xDC, 0xBA, 0xFF, 0xF9, 0xF3, 0xEA, 0xFF, 0xF6, 0xF0, 0xE4, 0xFF, 0xE9, 0xD7, + 0xB2, 0xFF, 0xED, 0xD6, 0xAC, 0xFF, 0xED, 0xCB, 0x8F, 0xFF, 0xEA, 0xBD, 0x74, 0xFF, 0xEA, 0xBD, + 0x75, 0xFF, 0xEA, 0xBD, 0x75, 0xFF, 0xEB, 0xBF, 0x7A, 0xFF, 0xED, 0xCA, 0x8E, 0xFF, 0xF0, 0xD3, + 0xA2, 0xD0, 0xED, 0xD7, 0xB3, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC, 0xD3, + 0xA9, 0x2B, 0xF0, 0xCE, 0x9A, 0xCB, 0xEE, 0xC8, 0x8D, 0xFF, 0xEB, 0xBF, 0x7D, 0xFF, 0xEB, 0xBE, + 0x78, 0xFF, 0xEB, 0xBE, 0x77, 0xFF, 0xEC, 0xC1, 0x7B, 0xFF, 0xF2, 0xD4, 0xA1, 0xFF, 0xF4, 0xDC, + 0xB3, 0xFF, 0xF4, 0xDB, 0xB1, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, + 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, + 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, + 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, + 0xB2, 0xFF, 0xF4, 0xDB, 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, + 0xB2, 0xFF, 0xF4, 0xDB, 0xB2, 0xFF, 0xF4, 0xDC, 0xB1, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDB, + 0xB2, 0xFF, 0xF1, 0xD9, 0xB0, 0xFF, 0xF1, 0xDD, 0xB8, 0xFF, 0xF0, 0xDC, 0xB8, 0xFF, 0xF0, 0xDA, + 0xB1, 0xFF, 0xF2, 0xD8, 0xAA, 0xFF, 0xED, 0xC4, 0x81, 0xFF, 0xEC, 0xBF, 0x78, 0xFF, 0xEC, 0xC0, + 0x79, 0xFF, 0xEC, 0xC2, 0x7D, 0xFF, 0xEF, 0xCB, 0x8E, 0xFF, 0xF2, 0xD4, 0xA1, 0xE5, 0xF0, 0xD8, + 0xAF, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF2, 0xD5, 0xA6, 0x3B, 0xF1, 0xD0, 0x9B, 0xD6, 0xEF, 0xCA, 0x8F, 0xFF, 0xEE, 0xC2, + 0x80, 0xFF, 0xED, 0xC1, 0x7B, 0xFF, 0xED, 0xC1, 0x7A, 0xFF, 0xF1, 0xCB, 0x8C, 0xFF, 0xF6, 0xDD, + 0xB3, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, + 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, + 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, + 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, + 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, + 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, + 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF5, 0xDE, 0xB5, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF2, 0xD1, 0x97, 0xFF, 0xEE, 0xC3, 0x7B, 0xFF, 0xEE, 0xC3, 0x7C, 0xFF, 0xEF, 0xC5, + 0x80, 0xFF, 0xF1, 0xCD, 0x8F, 0xFF, 0xF3, 0xD5, 0xA1, 0xED, 0xF3, 0xD9, 0xAD, 0x61, 0xD5, 0xE7, + 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xD6, 0xA8, 0x47, 0xF3, 0xD3, 0x9E, 0xDB, 0xF2, 0xCD, + 0x92, 0xFF, 0xF0, 0xC7, 0x84, 0xFF, 0xEF, 0xC4, 0x7F, 0xFF, 0xF0, 0xC5, 0x7F, 0xFF, 0xF4, 0xD4, + 0x9F, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, + 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, + 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, + 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, + 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, + 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, + 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF5, 0xDA, + 0xA9, 0xFF, 0xF1, 0xC9, 0x83, 0xFF, 0xF0, 0xC7, 0x7F, 0xFF, 0xF1, 0xC9, 0x84, 0xFF, 0xF3, 0xCF, + 0x92, 0xFF, 0xF5, 0xD7, 0xA3, 0xF1, 0xF4, 0xDA, 0xAF, 0x6F, 0xE5, 0xE4, 0xDD, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0xD8, 0xA9, 0x45, 0xF4, 0xD5, + 0xA0, 0xD3, 0xF3, 0xD1, 0x97, 0xFF, 0xF2, 0xCB, 0x8A, 0xFF, 0xF1, 0xC8, 0x82, 0xFF, 0xF2, 0xCB, + 0x86, 0xFF, 0xF6, 0xDB, 0xAB, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, + 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, + 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, + 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, + 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, + 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, + 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF7, 0xDF, 0xB3, 0xFF, 0xF3, 0xCE, + 0x8D, 0xFF, 0xF2, 0xCA, 0x82, 0xFF, 0xF3, 0xCD, 0x89, 0xFF, 0xF5, 0xD2, 0x98, 0xFF, 0xF6, 0xD8, + 0xA5, 0xE9, 0xF5, 0xDC, 0xB0, 0x6A, 0xEA, 0xE5, 0xDB, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0xDB, + 0xAF, 0x35, 0xF5, 0xD7, 0xA3, 0xBD, 0xF5, 0xD4, 0x9D, 0xFE, 0xF4, 0xCF, 0x91, 0xFF, 0xF3, 0xCB, + 0x87, 0xFF, 0xF4, 0xCE, 0x8C, 0xFF, 0xF7, 0xDD, 0xAE, 0xFF, 0xF9, 0xE6, 0xC1, 0xFF, 0xF9, 0xE6, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xF9, 0xE6, 0xC1, 0xFF, 0xF8, 0xE1, 0xB6, 0xFF, 0xF5, 0xD1, 0x93, 0xFF, 0xF4, 0xCC, + 0x87, 0xFF, 0xF5, 0xD0, 0x91, 0xFF, 0xF6, 0xD6, 0x9E, 0xFF, 0xF7, 0xDA, 0xA8, 0xD5, 0xF6, 0xDD, + 0xB3, 0x52, 0xEC, 0xED, 0xF2, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF3, 0xDC, 0xB4, 0x1D, 0xF5, 0xD8, 0xA7, 0x90, 0xF7, 0xD8, 0xA2, 0xF0, 0xF6, 0xD4, + 0x9A, 0xFF, 0xF5, 0xD0, 0x8F, 0xFF, 0xF5, 0xD0, 0x8F, 0xFF, 0xF8, 0xDC, 0xAC, 0xFF, 0xFA, 0xE6, + 0xC2, 0xFF, 0xFB, 0xE7, 0xC5, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, + 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, + 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, + 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, + 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFA, 0xE7, + 0xC4, 0xFF, 0xF9, 0xE0, 0xB3, 0xFF, 0xF6, 0xD3, 0x94, 0xFF, 0xF5, 0xD0, 0x8E, 0xFF, 0xF7, 0xD5, + 0x9A, 0xFF, 0xF8, 0xDA, 0xA4, 0xF9, 0xF8, 0xDC, 0xAC, 0xAF, 0xF8, 0xE0, 0xB4, 0x32, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0xDA, 0xC4, 0x08, 0xF5, 0xDA, 0xAB, 0x51, 0xF7, 0xD9, + 0xA6, 0xC2, 0xF8, 0xD9, 0xA2, 0xFC, 0xF8, 0xD6, 0x9A, 0xFF, 0xF7, 0xD3, 0x94, 0xFF, 0xF8, 0xD9, + 0xA3, 0xFF, 0xFB, 0xE4, 0xBD, 0xFF, 0xFC, 0xE8, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, + 0xC9, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xE9, + 0xC8, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xE9, + 0xC8, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xE9, + 0xC8, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFB, 0xE6, 0xC1, 0xFF, 0xF9, 0xDD, + 0xAA, 0xFF, 0xF7, 0xD5, 0x96, 0xFF, 0xF8, 0xD6, 0x99, 0xFF, 0xF8, 0xDA, 0xA4, 0xFF, 0xF9, 0xDC, + 0xA9, 0xD6, 0xF8, 0xDE, 0xB0, 0x6D, 0xF7, 0xE5, 0xC5, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xDC, + 0xB6, 0x1A, 0xF7, 0xDC, 0xAB, 0x74, 0xF9, 0xDC, 0xA8, 0xD2, 0xF9, 0xDA, 0xA4, 0xFC, 0xF8, 0xD8, + 0x9E, 0xFF, 0xF9, 0xD8, 0x9F, 0xFF, 0xFA, 0xDF, 0xAF, 0xFF, 0xFB, 0xE6, 0xC0, 0xFF, 0xFC, 0xEA, + 0xCA, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, + 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, + 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, + 0xCB, 0xFF, 0xFC, 0xE7, 0xC3, 0xFF, 0xFB, 0xE1, 0xB4, 0xFF, 0xF9, 0xDA, 0xA2, 0xFF, 0xF9, 0xD9, + 0x9E, 0xFF, 0xF9, 0xDB, 0xA5, 0xFF, 0xF9, 0xDD, 0xAB, 0xE1, 0xF8, 0xDE, 0xAF, 0x8E, 0xF8, 0xE2, + 0xB9, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0xDE, 0xB5, 0x21, 0xF8, 0xDD, 0xAD, 0x6E, 0xF9, 0xDD, + 0xAA, 0xBE, 0xFA, 0xDC, 0xA7, 0xEF, 0xFA, 0xDB, 0xA4, 0xFF, 0xFA, 0xDC, 0xA6, 0xFF, 0xFB, 0xE0, + 0xAF, 0xFF, 0xFB, 0xE4, 0xBB, 0xFF, 0xFC, 0xE8, 0xC3, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEB, + 0xCC, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, 0xCE, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, + 0xCC, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xE9, 0xC5, 0xFF, 0xFB, 0xE5, 0xBD, 0xFF, 0xFB, 0xE1, + 0xB2, 0xFF, 0xFA, 0xDD, 0xA8, 0xFF, 0xFA, 0xDC, 0xA5, 0xFF, 0xFA, 0xDD, 0xA8, 0xF5, 0xF9, 0xDE, + 0xAC, 0xCE, 0xF9, 0xDE, 0xB0, 0x83, 0xF6, 0xE0, 0xB7, 0x31, 0xE6, 0xE4, 0xDF, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0xE1, + 0xBD, 0x12, 0xFA, 0xE3, 0xB8, 0x44, 0xFB, 0xE0, 0xB0, 0x84, 0xFB, 0xDF, 0xAE, 0xBB, 0xFB, 0xDE, + 0xAB, 0xE2, 0xFB, 0xDE, 0xAA, 0xF4, 0xFB, 0xDF, 0xAC, 0xFD, 0xFB, 0xE1, 0xB0, 0xFF, 0xFB, 0xE2, + 0xB3, 0xFF, 0xFB, 0xE3, 0xB6, 0xFF, 0xFB, 0xE3, 0xB7, 0xFF, 0xFB, 0xE3, 0xB6, 0xFF, 0xFB, 0xE2, + 0xB4, 0xFF, 0xFB, 0xE1, 0xB1, 0xFF, 0xFB, 0xE0, 0xAE, 0xFF, 0xFB, 0xDF, 0xAB, 0xF6, 0xFB, 0xDF, + 0xAC, 0xE8, 0xFB, 0xE0, 0xB0, 0xC6, 0xFB, 0xE1, 0xB1, 0x92, 0xFB, 0xE3, 0xB8, 0x52, 0xF7, 0xE3, + 0xBE, 0x1B, 0xA5, 0xE6, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xEA, 0xC9, 0x0F, 0xFC, 0xE3, + 0xB5, 0x29, 0xFB, 0xE1, 0xB3, 0x4D, 0xFB, 0xE0, 0xAF, 0x6C, 0xFB, 0xE0, 0xAD, 0x89, 0xFB, 0xE0, + 0xAE, 0x9C, 0xFB, 0xE0, 0xAE, 0xA6, 0xFB, 0xE0, 0xAF, 0xAB, 0xFB, 0xE0, 0xAE, 0xA8, 0xFB, 0xE0, + 0xAE, 0x9F, 0xFB, 0xE0, 0xAE, 0x8F, 0xFB, 0xE1, 0xAF, 0x74, 0xFB, 0xE2, 0xB4, 0x55, 0xFC, 0xE3, + 0xB7, 0x32, 0xFC, 0xE8, 0xC3, 0x14, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xEC, + 0xCE, 0x06, 0xFD, 0xE8, 0xC0, 0x09, 0xFC, 0xE6, 0xBC, 0x0B, 0xFC, 0xE8, 0xC0, 0x0A, 0xFD, 0xEC, + 0xCB, 0x07, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xC0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xE0, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x7F, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xC0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xE0, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF8, + 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFE, + 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, + 0xC0, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFC, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0xFF, 0x28, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x60, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, + 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, + 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, + 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, + 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, + 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, + 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, + 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, + 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, + 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, + 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x0F, 0x82, 0x44, 0x0C, 0x12, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, + 0x0C, 0x17, 0x82, 0x44, 0x0C, 0x1A, 0x82, 0x44, 0x0C, 0x1C, 0x82, 0x44, 0x0C, 0x1E, 0x82, 0x44, + 0x0C, 0x1F, 0x82, 0x44, 0x0C, 0x20, 0x82, 0x44, 0x0C, 0x21, 0x82, 0x44, 0x0C, 0x22, 0x82, 0x44, + 0x0C, 0x23, 0x82, 0x44, 0x0C, 0x23, 0x82, 0x44, 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x22, 0x82, 0x44, + 0x0C, 0x21, 0x82, 0x44, 0x0C, 0x20, 0x82, 0x44, 0x0C, 0x1E, 0x82, 0x44, 0x0C, 0x1D, 0x82, 0x44, + 0x0C, 0x1B, 0x82, 0x44, 0x0C, 0x18, 0x82, 0x44, 0x0C, 0x16, 0x82, 0x44, 0x0C, 0x13, 0x82, 0x44, + 0x0C, 0x10, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, + 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, + 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x1A, 0x82, 0x44, + 0x0C, 0x20, 0x82, 0x44, 0x0C, 0x26, 0x82, 0x44, 0x0C, 0x2B, 0x82, 0x44, 0x0C, 0x30, 0x82, 0x44, + 0x0C, 0x34, 0x82, 0x44, 0x0C, 0x38, 0x82, 0x44, 0x0C, 0x3B, 0x82, 0x44, 0x0C, 0x3F, 0x82, 0x44, + 0x0C, 0x41, 0x82, 0x44, 0x0C, 0x42, 0x82, 0x44, 0x0C, 0x44, 0x82, 0x44, 0x0C, 0x45, 0x82, 0x44, + 0x0C, 0x45, 0x82, 0x44, 0x0C, 0x45, 0x82, 0x44, 0x0C, 0x46, 0x82, 0x44, 0x0C, 0x45, 0x82, 0x44, + 0x0C, 0x43, 0x82, 0x44, 0x0C, 0x41, 0x82, 0x44, 0x0C, 0x3F, 0x82, 0x44, 0x0C, 0x3D, 0x82, 0x44, + 0x0C, 0x3A, 0x82, 0x44, 0x0C, 0x36, 0x82, 0x44, 0x0C, 0x32, 0x82, 0x44, 0x0C, 0x2D, 0x82, 0x44, + 0x0C, 0x28, 0x82, 0x44, 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x1C, 0x82, 0x44, 0x0C, 0x16, 0x82, 0x44, + 0x0C, 0x0F, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x02, 0x81, 0x43, + 0x0B, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, + 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x1F, 0x82, 0x44, 0x0C, 0x2B, 0x82, 0x44, 0x0C, 0x37, 0x82, 0x44, + 0x0C, 0x41, 0x82, 0x44, 0x0C, 0x49, 0x82, 0x44, 0x0C, 0x51, 0x82, 0x44, 0x0C, 0x57, 0x82, 0x44, + 0x0C, 0x5C, 0x82, 0x44, 0x0C, 0x61, 0x82, 0x44, 0x0C, 0x65, 0x82, 0x44, 0x0C, 0x68, 0x82, 0x44, + 0x0C, 0x6B, 0x82, 0x44, 0x0C, 0x6D, 0x82, 0x44, 0x0C, 0x6F, 0x82, 0x44, 0x0B, 0x6F, 0x82, 0x43, + 0x0B, 0x70, 0x82, 0x44, 0x0B, 0x70, 0x82, 0x44, 0x0C, 0x70, 0x82, 0x44, 0x0C, 0x6F, 0x82, 0x44, + 0x0C, 0x6E, 0x82, 0x44, 0x0C, 0x6C, 0x82, 0x44, 0x0C, 0x69, 0x82, 0x44, 0x0C, 0x66, 0x82, 0x44, + 0x0C, 0x63, 0x82, 0x44, 0x0C, 0x5E, 0x82, 0x44, 0x0C, 0x59, 0x82, 0x44, 0x0C, 0x53, 0x82, 0x44, + 0x0C, 0x4C, 0x82, 0x44, 0x0C, 0x44, 0x82, 0x44, 0x0C, 0x3A, 0x82, 0x44, 0x0C, 0x2F, 0x82, 0x44, + 0x0C, 0x23, 0x82, 0x44, 0x0C, 0x17, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, + 0x0C, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x12, 0x82, 0x44, + 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x35, 0x82, 0x44, 0x0C, 0x49, 0x82, 0x44, 0x0C, 0x59, 0x82, 0x44, + 0x0C, 0x67, 0x82, 0x44, 0x0C, 0x71, 0x82, 0x44, 0x0C, 0x79, 0x82, 0x44, 0x0C, 0x80, 0x82, 0x44, + 0x0C, 0x85, 0x82, 0x44, 0x0C, 0x8A, 0x81, 0x43, 0x0A, 0x8D, 0x81, 0x42, 0x09, 0x8F, 0x81, 0x43, + 0x0A, 0x91, 0x83, 0x45, 0x0D, 0x94, 0x85, 0x49, 0x12, 0x98, 0x87, 0x4B, 0x14, 0x9A, 0x87, 0x4B, + 0x14, 0x9B, 0x87, 0x4B, 0x14, 0x9B, 0x85, 0x48, 0x12, 0x99, 0x83, 0x45, 0x0D, 0x96, 0x81, 0x42, + 0x0A, 0x94, 0x81, 0x42, 0x09, 0x92, 0x81, 0x43, 0x0A, 0x90, 0x82, 0x44, 0x0C, 0x8E, 0x82, 0x44, + 0x0C, 0x8B, 0x82, 0x44, 0x0C, 0x87, 0x82, 0x44, 0x0C, 0x82, 0x82, 0x44, 0x0C, 0x7C, 0x82, 0x44, + 0x0C, 0x74, 0x82, 0x44, 0x0C, 0x6B, 0x82, 0x44, 0x0C, 0x5E, 0x82, 0x44, 0x0C, 0x4F, 0x82, 0x44, + 0x0C, 0x3C, 0x82, 0x44, 0x0C, 0x28, 0x82, 0x44, 0x0C, 0x17, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, + 0x0C, 0x04, 0x8B, 0x51, 0x1D, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x4E, + 0x18, 0x01, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x1A, 0x82, 0x44, + 0x0C, 0x2F, 0x82, 0x44, 0x0C, 0x49, 0x82, 0x44, 0x0C, 0x62, 0x82, 0x44, 0x0C, 0x76, 0x82, 0x44, + 0x0C, 0x85, 0x82, 0x44, 0x0C, 0x90, 0x82, 0x44, 0x0C, 0x98, 0x82, 0x43, 0x0B, 0x9E, 0x81, 0x43, + 0x0A, 0xA2, 0x84, 0x47, 0x0F, 0xA8, 0x8B, 0x52, 0x1E, 0xB2, 0x92, 0x5F, 0x32, 0xC1, 0x96, 0x67, + 0x40, 0xD0, 0x97, 0x6B, 0x48, 0xDB, 0x98, 0x6E, 0x4E, 0xE5, 0x97, 0x6E, 0x4F, 0xEA, 0x97, 0x6E, + 0x50, 0xEB, 0x99, 0x70, 0x51, 0xEA, 0x9A, 0x70, 0x50, 0xE5, 0x99, 0x6D, 0x4A, 0xDB, 0x98, 0x69, + 0x42, 0xD0, 0x93, 0x5F, 0x32, 0xC2, 0x8A, 0x51, 0x1D, 0xB4, 0x83, 0x46, 0x0E, 0xAB, 0x81, 0x42, + 0x0A, 0xA7, 0x82, 0x43, 0x0B, 0xA4, 0x82, 0x44, 0x0C, 0xA1, 0x82, 0x44, 0x0C, 0x9B, 0x82, 0x44, + 0x0C, 0x94, 0x82, 0x44, 0x0C, 0x8A, 0x82, 0x44, 0x0C, 0x7C, 0x82, 0x44, 0x0C, 0x69, 0x82, 0x44, + 0x0C, 0x51, 0x82, 0x44, 0x0C, 0x38, 0x82, 0x44, 0x0C, 0x20, 0x82, 0x44, 0x0C, 0x0F, 0x82, 0x44, + 0x0C, 0x06, 0x83, 0x45, 0x0E, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8B, 0x52, + 0x1D, 0x01, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x1C, 0x82, 0x44, + 0x0C, 0x34, 0x82, 0x44, 0x0C, 0x4F, 0x82, 0x44, 0x0C, 0x6A, 0x82, 0x44, 0x0C, 0x80, 0x82, 0x44, + 0x0C, 0x90, 0x82, 0x44, 0x0B, 0x9B, 0x81, 0x43, 0x0A, 0xA1, 0x88, 0x4D, 0x17, 0xAD, 0x93, 0x60, + 0x33, 0xC6, 0x97, 0x6A, 0x47, 0xE1, 0x92, 0x68, 0x4A, 0xF3, 0x89, 0x5F, 0x43, 0xFC, 0x81, 0x57, + 0x3C, 0xFF, 0x7C, 0x51, 0x37, 0xFF, 0x79, 0x4D, 0x33, 0xFF, 0x78, 0x4C, 0x32, 0xFF, 0x79, 0x4D, + 0x33, 0xFF, 0x7A, 0x4F, 0x35, 0xFF, 0x7E, 0x54, 0x3A, 0xFF, 0x83, 0x5A, 0x40, 0xFF, 0x8A, 0x61, + 0x48, 0xFF, 0x92, 0x6B, 0x50, 0xFC, 0x9A, 0x71, 0x54, 0xF3, 0x9B, 0x70, 0x4D, 0xE1, 0x93, 0x60, + 0x33, 0xC7, 0x87, 0x4B, 0x14, 0xB2, 0x81, 0x43, 0x0A, 0xA9, 0x82, 0x44, 0x0C, 0xA5, 0x82, 0x44, + 0x0C, 0x9E, 0x82, 0x44, 0x0C, 0x94, 0x82, 0x44, 0x0C, 0x86, 0x82, 0x44, 0x0C, 0x72, 0x82, 0x44, + 0x0C, 0x59, 0x82, 0x44, 0x0C, 0x3D, 0x82, 0x44, 0x0C, 0x23, 0x82, 0x44, 0x0C, 0x11, 0x82, 0x44, + 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x4B, + 0x14, 0x01, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x18, 0x82, 0x44, + 0x0C, 0x2D, 0x82, 0x44, 0x0C, 0x45, 0x82, 0x44, 0x0C, 0x5D, 0x82, 0x44, 0x0C, 0x71, 0x81, 0x42, + 0x0A, 0x7E, 0x87, 0x4B, 0x14, 0x8F, 0x95, 0x64, 0x39, 0xBB, 0x95, 0x6A, 0x49, 0xE7, 0x87, 0x5C, + 0x3F, 0xFC, 0x77, 0x4A, 0x2E, 0xFF, 0x6F, 0x40, 0x24, 0xFF, 0x6C, 0x3C, 0x21, 0xFF, 0x6D, 0x3D, + 0x21, 0xFF, 0x6E, 0x3F, 0x22, 0xFF, 0x70, 0x41, 0x24, 0xFF, 0x72, 0x43, 0x26, 0xFF, 0x74, 0x45, + 0x27, 0xFF, 0x75, 0x46, 0x29, 0xFF, 0x76, 0x48, 0x2B, 0xFF, 0x77, 0x49, 0x2C, 0xFF, 0x78, 0x4A, + 0x2E, 0xFF, 0x7A, 0x4D, 0x31, 0xFF, 0x7F, 0x53, 0x38, 0xFF, 0x89, 0x5F, 0x44, 0xFF, 0x96, 0x6E, + 0x53, 0xFC, 0x9E, 0x75, 0x55, 0xE7, 0x96, 0x65, 0x3A, 0xBD, 0x85, 0x49, 0x12, 0x98, 0x81, 0x42, + 0x0A, 0x8D, 0x82, 0x44, 0x0C, 0x85, 0x82, 0x44, 0x0C, 0x77, 0x82, 0x44, 0x0C, 0x65, 0x82, 0x44, + 0x0C, 0x4E, 0x82, 0x44, 0x0C, 0x35, 0x82, 0x44, 0x0C, 0x1F, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, + 0x0C, 0x05, 0x84, 0x46, 0x0F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x11, 0x82, 0x44, + 0x0C, 0x1F, 0x82, 0x44, 0x0C, 0x30, 0x81, 0x43, 0x0B, 0x42, 0x82, 0x44, 0x0C, 0x50, 0x95, 0x62, + 0x35, 0x81, 0x98, 0x6C, 0x4A, 0xD0, 0x85, 0x59, 0x3B, 0xFB, 0x71, 0x41, 0x24, 0xFF, 0x69, 0x37, + 0x1A, 0xFF, 0x69, 0x37, 0x19, 0xFF, 0x6C, 0x3A, 0x1B, 0xFF, 0x6F, 0x3D, 0x1D, 0xFF, 0x72, 0x40, + 0x1F, 0xFF, 0x75, 0x43, 0x21, 0xFF, 0x77, 0x45, 0x23, 0xFF, 0x79, 0x47, 0x25, 0xFF, 0x7B, 0x49, + 0x26, 0xFF, 0x7C, 0x4B, 0x28, 0xFF, 0x7D, 0x4C, 0x29, 0xFF, 0x7D, 0x4D, 0x2B, 0xFF, 0x7E, 0x4E, + 0x2C, 0xFF, 0x7D, 0x4E, 0x2D, 0xFF, 0x7D, 0x4E, 0x2E, 0xFF, 0x7C, 0x4E, 0x30, 0xFF, 0x7F, 0x52, + 0x34, 0xFF, 0x88, 0x5D, 0x41, 0xFF, 0x98, 0x71, 0x55, 0xFA, 0xA1, 0x77, 0x56, 0xCF, 0x93, 0x5F, + 0x30, 0x87, 0x81, 0x43, 0x0A, 0x61, 0x82, 0x43, 0x0B, 0x57, 0x82, 0x44, 0x0C, 0x48, 0x82, 0x44, + 0x0C, 0x37, 0x82, 0x44, 0x0C, 0x25, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, + 0x0C, 0x04, 0x8C, 0x54, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x83, 0x45, 0x0D, 0x01, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, + 0x0C, 0x10, 0x80, 0x40, 0x07, 0x19, 0x8C, 0x51, 0x1C, 0x28, 0x9F, 0x74, 0x50, 0x80, 0x8E, 0x62, + 0x42, 0xE7, 0x73, 0x41, 0x22, 0xFF, 0x64, 0x30, 0x12, 0xFF, 0x63, 0x2E, 0x0E, 0xFF, 0x66, 0x31, + 0x0F, 0xFF, 0x6A, 0x34, 0x11, 0xFF, 0x6E, 0x37, 0x13, 0xFF, 0x72, 0x3B, 0x14, 0xFF, 0x75, 0x3F, + 0x17, 0xFF, 0x79, 0x43, 0x1A, 0xFF, 0x7C, 0x47, 0x1E, 0xFF, 0x7F, 0x4A, 0x21, 0xFF, 0x82, 0x4D, + 0x24, 0xFF, 0x83, 0x4F, 0x27, 0xFF, 0x84, 0x50, 0x29, 0xFF, 0x85, 0x51, 0x2A, 0xFF, 0x85, 0x52, + 0x2B, 0xFF, 0x84, 0x52, 0x2D, 0xFF, 0x84, 0x52, 0x2E, 0xFF, 0x83, 0x52, 0x2F, 0xFF, 0x82, 0x52, + 0x30, 0xFF, 0x80, 0x51, 0x31, 0xFF, 0x83, 0x55, 0x37, 0xFF, 0x90, 0x65, 0x49, 0xFF, 0xA2, 0x7B, + 0x5E, 0xE5, 0xA3, 0x79, 0x54, 0x80, 0x86, 0x49, 0x12, 0x34, 0x81, 0x42, 0x09, 0x28, 0x82, 0x44, + 0x0C, 0x1E, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x05, 0x83, 0x46, + 0x0F, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, 0x0D, 0x01, 0x83, 0x45, 0x0D, 0x03, 0x73, 0x2D, + 0x00, 0x05, 0xA6, 0x79, 0x50, 0x12, 0xA3, 0x7B, 0x5C, 0x86, 0x84, 0x55, 0x34, 0xF5, 0x66, 0x31, + 0x10, 0xFF, 0x5E, 0x27, 0x06, 0xFF, 0x61, 0x29, 0x05, 0xFF, 0x65, 0x2C, 0x06, 0xFF, 0x69, 0x2F, + 0x07, 0xFF, 0x6D, 0x31, 0x07, 0xFF, 0x70, 0x34, 0x08, 0xFF, 0x73, 0x37, 0x08, 0xFF, 0x75, 0x39, + 0x09, 0xFF, 0x77, 0x3B, 0x0A, 0xFF, 0x79, 0x3D, 0x0C, 0xFF, 0x7C, 0x3F, 0x0E, 0xFF, 0x7E, 0x43, + 0x12, 0xFF, 0x81, 0x47, 0x17, 0xFF, 0x85, 0x4D, 0x1D, 0xFF, 0x88, 0x52, 0x24, 0xFF, 0x8A, 0x55, + 0x29, 0xFF, 0x8B, 0x57, 0x2C, 0xFF, 0x8B, 0x57, 0x2D, 0xFF, 0x8A, 0x57, 0x2E, 0xFF, 0x89, 0x56, + 0x2F, 0xFF, 0x87, 0x55, 0x30, 0xFF, 0x85, 0x54, 0x30, 0xFF, 0x84, 0x54, 0x33, 0xFF, 0x8B, 0x5E, + 0x3F, 0xFF, 0x9F, 0x78, 0x5B, 0xF1, 0xAE, 0x89, 0x6B, 0x80, 0x94, 0x5E, 0x2D, 0x16, 0x7D, 0x3C, + 0x01, 0x0C, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCA, 0xAB, + 0x8F, 0x09, 0xA5, 0x7E, 0x5F, 0x84, 0x81, 0x51, 0x2F, 0xF9, 0x65, 0x2E, 0x0C, 0xFF, 0x61, 0x29, + 0x06, 0xFF, 0x65, 0x2C, 0x06, 0xFF, 0x69, 0x30, 0x07, 0xFF, 0x6B, 0x32, 0x07, 0xFF, 0x6E, 0x34, + 0x07, 0xFF, 0x74, 0x39, 0x09, 0xFF, 0x79, 0x3C, 0x09, 0xFF, 0x7B, 0x3E, 0x0A, 0xFF, 0x7D, 0x3F, + 0x0A, 0xFF, 0x7E, 0x40, 0x0A, 0xFF, 0x7F, 0x40, 0x0A, 0xFF, 0x7F, 0x41, 0x0A, 0xFF, 0x80, 0x41, + 0x0A, 0xFF, 0x80, 0x41, 0x0A, 0xFF, 0x80, 0x42, 0x0B, 0xFF, 0x82, 0x44, 0x0E, 0xFF, 0x84, 0x48, + 0x13, 0xFF, 0x89, 0x4F, 0x1C, 0xFF, 0x8C, 0x55, 0x25, 0xFF, 0x8F, 0x5A, 0x2C, 0xFF, 0x8F, 0x5B, + 0x2E, 0xFF, 0x8D, 0x5A, 0x2F, 0xFF, 0x8B, 0x59, 0x30, 0xFF, 0x89, 0x58, 0x31, 0xFF, 0x87, 0x56, + 0x32, 0xFF, 0x8B, 0x5D, 0x3B, 0xFF, 0xA0, 0x78, 0x59, 0xF6, 0xB4, 0x91, 0x75, 0x79, 0xAB, 0x7F, + 0x56, 0x07, 0x63, 0x16, 0x00, 0x02, 0x85, 0x48, 0x11, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFA, 0x03, 0xAC, 0x86, + 0x68, 0x76, 0x85, 0x54, 0x31, 0xF7, 0x67, 0x2F, 0x0B, 0xFF, 0x64, 0x2B, 0x06, 0xFF, 0x69, 0x2F, + 0x07, 0xFF, 0x6D, 0x33, 0x08, 0xFF, 0x6A, 0x32, 0x05, 0xFF, 0x6E, 0x3E, 0x14, 0xFF, 0x70, 0x43, + 0x19, 0xFF, 0x6D, 0x38, 0x07, 0xFF, 0x7C, 0x40, 0x0B, 0xFF, 0x82, 0x43, 0x0B, 0xFF, 0x83, 0x44, + 0x0B, 0xFF, 0x84, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x46, + 0x0C, 0xFF, 0x85, 0x46, 0x0C, 0xFF, 0x85, 0x46, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, + 0x0B, 0xFF, 0x84, 0x45, 0x0B, 0xFF, 0x85, 0x47, 0x0E, 0xFF, 0x89, 0x4C, 0x15, 0xFF, 0x8E, 0x55, + 0x21, 0xFF, 0x91, 0x5B, 0x2B, 0xFF, 0x92, 0x5D, 0x2F, 0xFF, 0x90, 0x5C, 0x30, 0xFF, 0x8D, 0x5A, + 0x31, 0xFF, 0x8A, 0x58, 0x31, 0xFF, 0x8E, 0x5E, 0x3A, 0xFF, 0xA3, 0x7B, 0x5B, 0xF2, 0xBA, 0x99, + 0x7D, 0x67, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x91, 0x74, 0x52, 0x8D, 0x5E, + 0x3A, 0xEE, 0x6B, 0x33, 0x0E, 0xFF, 0x68, 0x2D, 0x06, 0xFF, 0x6D, 0x31, 0x07, 0xFF, 0x71, 0x35, + 0x08, 0xFF, 0x6A, 0x33, 0x06, 0xFF, 0x77, 0x51, 0x2C, 0xFF, 0xA8, 0x97, 0x83, 0xFF, 0xC1, 0xB6, + 0xA8, 0xFF, 0x83, 0x63, 0x40, 0xFF, 0x6E, 0x3B, 0x08, 0xFF, 0x7F, 0x44, 0x0B, 0xFF, 0x87, 0x47, + 0x0C, 0xFF, 0x88, 0x48, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, + 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, + 0x0D, 0xFF, 0x88, 0x48, 0x0D, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x47, 0x0C, 0xFF, 0x87, 0x48, + 0x0D, 0xFF, 0x8A, 0x4C, 0x13, 0xFF, 0x90, 0x56, 0x21, 0xFF, 0x94, 0x5D, 0x2C, 0xFF, 0x93, 0x5E, + 0x30, 0xFF, 0x90, 0x5C, 0x30, 0xFF, 0x8D, 0x5A, 0x31, 0xFF, 0x91, 0x62, 0x3D, 0xFF, 0xA9, 0x82, + 0x62, 0xE8, 0xC2, 0xA4, 0x8A, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xA4, 0x87, 0x25, 0x9A, 0x6E, 0x4A, 0xD1, 0x72, 0x3B, + 0x13, 0xFF, 0x6A, 0x2F, 0x07, 0xFF, 0x6F, 0x33, 0x08, 0xFF, 0x74, 0x38, 0x09, 0xFF, 0x6D, 0x36, + 0x06, 0xFF, 0x80, 0x5E, 0x3A, 0xFF, 0xD1, 0xCA, 0xC1, 0xFF, 0xD9, 0xD7, 0xD4, 0xFF, 0xB6, 0xB0, + 0xA4, 0xFF, 0xC7, 0xBE, 0xB3, 0xFF, 0x9D, 0x85, 0x69, 0xFF, 0x72, 0x43, 0x11, 0xFF, 0x7D, 0x44, + 0x0A, 0xFF, 0x88, 0x4A, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4A, + 0x0D, 0xFF, 0x8A, 0x4A, 0x0C, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8C, 0x4F, 0x14, 0xFF, 0x92, 0x59, + 0x24, 0xFF, 0x95, 0x5F, 0x2F, 0xFF, 0x93, 0x5E, 0x30, 0xFF, 0x8F, 0x5C, 0x31, 0xFF, 0x98, 0x69, + 0x43, 0xFF, 0xB2, 0x8D, 0x6D, 0xC7, 0xCD, 0xB1, 0x99, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFA, 0xF1, 0xE4, 0x04, 0xAB, 0x83, 0x61, 0x92, 0x81, 0x4B, 0x23, 0xFF, 0x6C, 0x31, + 0x08, 0xFF, 0x71, 0x34, 0x08, 0xFF, 0x77, 0x3A, 0x09, 0xFF, 0x71, 0x39, 0x07, 0xFF, 0x7F, 0x5B, + 0x35, 0xFF, 0xD3, 0xCC, 0xC3, 0xFF, 0xE7, 0xE6, 0xE7, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xDE, 0xDC, + 0xD9, 0xFF, 0xAE, 0xA6, 0x98, 0xFF, 0xB8, 0xB0, 0xA3, 0xFF, 0xB4, 0xA4, 0x8F, 0xFF, 0x7A, 0x52, + 0x24, 0xFF, 0x79, 0x43, 0x09, 0xFF, 0x88, 0x4B, 0x0D, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8C, 0x4C, + 0x0F, 0xFF, 0x90, 0x54, 0x1A, 0xFF, 0x96, 0x5E, 0x2B, 0xFF, 0x95, 0x5F, 0x30, 0xFF, 0x92, 0x5F, + 0x33, 0xFF, 0xA2, 0x76, 0x50, 0xFF, 0xBD, 0x9B, 0x7D, 0x84, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xBE, 0x9C, 0x7D, 0x3C, 0x95, 0x65, 0x3D, 0xEA, 0x73, 0x37, 0x0D, 0xFF, 0x72, 0x35, + 0x08, 0xFF, 0x79, 0x3B, 0x09, 0xFF, 0x78, 0x3C, 0x08, 0xFF, 0x7A, 0x50, 0x25, 0xFF, 0xCC, 0xC2, + 0xB7, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE7, 0xE6, 0xE6, 0xFF, 0xE8, 0xE7, 0xE7, 0xFF, 0xE9, 0xE9, + 0xE9, 0xFF, 0xE6, 0xE5, 0xE4, 0xFF, 0xAF, 0xA8, 0x9B, 0xFF, 0xA3, 0x9A, 0x8A, 0xFF, 0xBF, 0xB5, + 0xA7, 0xFF, 0x89, 0x69, 0x42, 0xFF, 0x76, 0x43, 0x0A, 0xFF, 0x87, 0x4B, 0x0C, 0xFF, 0x8E, 0x4F, + 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, + 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, + 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0D, 0xFF, 0x8F, 0x51, 0x13, 0xFF, 0x95, 0x5C, 0x25, 0xFF, 0x96, 0x60, + 0x2F, 0xFF, 0x98, 0x66, 0x39, 0xFF, 0xB0, 0x89, 0x65, 0xE2, 0xCB, 0xAE, 0x93, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0x04, 0xAD, 0x84, 0x60, 0x9A, 0x83, 0x4B, 0x1F, 0xFF, 0x74, 0x36, 0x08, 0xFF, 0x7A, 0x3B, + 0x09, 0xFF, 0x80, 0x40, 0x0A, 0xFF, 0x80, 0x4B, 0x16, 0xFF, 0xC2, 0xB2, 0xA0, 0xFF, 0xEA, 0xEA, + 0xEA, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xEB, 0xEB, 0xEA, 0xFF, 0xEC, 0xEC, + 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xBA, 0xB4, 0xA9, 0xFF, 0x92, 0x86, + 0x71, 0xFF, 0xBE, 0xB5, 0xAA, 0xFF, 0x9D, 0x86, 0x69, 0xFF, 0x76, 0x49, 0x13, 0xFF, 0x83, 0x4A, + 0x0C, 0xFF, 0x8F, 0x50, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x93, 0x51, 0x0F, 0xFF, 0x93, 0x51, + 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x50, 0x11, 0xFF, 0x94, 0x5A, + 0x21, 0xFF, 0x97, 0x61, 0x2F, 0xFF, 0xA5, 0x77, 0x4C, 0xFF, 0xC0, 0x9E, 0x7E, 0x8C, 0xFF, 0xFF, + 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0xAE, + 0x91, 0x2B, 0x9E, 0x6D, 0x44, 0xE2, 0x7A, 0x3D, 0x0F, 0xFF, 0x7A, 0x3B, 0x09, 0xFF, 0x81, 0x41, + 0x0B, 0xFF, 0x86, 0x46, 0x0B, 0xFF, 0x8E, 0x57, 0x20, 0xFF, 0xD8, 0xCC, 0xBD, 0xFF, 0xED, 0xEE, + 0xEF, 0xFF, 0xEB, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xEF, 0xEF, 0xEE, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xCA, 0xC5, + 0xBD, 0xFF, 0x8B, 0x7D, 0x66, 0xFF, 0xB3, 0xAB, 0x9C, 0xFF, 0xB3, 0xA4, 0x90, 0xFF, 0x7D, 0x57, + 0x26, 0xFF, 0x7F, 0x4A, 0x0C, 0xFF, 0x90, 0x53, 0x10, 0xFF, 0x95, 0x55, 0x11, 0xFF, 0x96, 0x55, + 0x11, 0xFF, 0x95, 0x55, 0x11, 0xFF, 0x95, 0x55, 0x11, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, + 0x10, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x95, 0x54, + 0x0F, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x93, 0x52, 0x0E, 0xFF, 0x91, 0x50, + 0x10, 0xFF, 0x94, 0x59, 0x1E, 0xFF, 0x9E, 0x69, 0x38, 0xFF, 0xB7, 0x90, 0x6A, 0xD9, 0xD2, 0xB7, + 0x9C, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBC, 0x97, + 0x73, 0x6D, 0x90, 0x5A, 0x2B, 0xFE, 0x7B, 0x3C, 0x0A, 0xFF, 0x81, 0x41, 0x0A, 0xFF, 0x88, 0x47, + 0x0C, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8D, 0x4E, 0x0C, 0xFF, 0xA1, 0x76, 0x45, 0xFF, 0xE6, 0xE1, + 0xDA, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEE, 0xED, 0xFF, 0xEE, 0xEE, 0xED, 0xFF, 0xEE, 0xEE, + 0xED, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF3, 0xF3, + 0xF4, 0xFF, 0xD9, 0xD7, 0xD2, 0xFF, 0x8F, 0x82, 0x6A, 0xFF, 0xA4, 0x9A, 0x87, 0xFF, 0xC5, 0xBC, + 0xB0, 0xFF, 0x8D, 0x70, 0x48, 0xFF, 0x7D, 0x4C, 0x10, 0xFF, 0x90, 0x55, 0x12, 0xFF, 0x98, 0x59, + 0x13, 0xFF, 0x9A, 0x5A, 0x13, 0xFF, 0x9A, 0x59, 0x13, 0xFF, 0x99, 0x59, 0x13, 0xFF, 0x99, 0x59, + 0x13, 0xFF, 0x99, 0x59, 0x13, 0xFF, 0x99, 0x58, 0x12, 0xFF, 0x98, 0x57, 0x11, 0xFF, 0x98, 0x56, + 0x10, 0xFF, 0x98, 0x56, 0x10, 0xFF, 0x98, 0x56, 0x10, 0xFF, 0x97, 0x55, 0x10, 0xFF, 0x95, 0x53, + 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x97, 0x5B, 0x21, 0xFF, 0xAF, 0x81, 0x56, 0xFB, 0xCA, 0xAA, + 0x8A, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF9, 0xF0, 0xE2, 0x07, 0xB0, 0x85, + 0x5D, 0xAD, 0x88, 0x4C, 0x1A, 0xFF, 0x80, 0x3F, 0x0A, 0xFF, 0x87, 0x46, 0x0C, 0xFF, 0x8E, 0x4D, + 0x0D, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x97, 0x55, 0x10, 0xFF, 0x92, 0x54, 0x0F, 0xFF, 0xB4, 0x94, + 0x6C, 0xFF, 0xEC, 0xEB, 0xE9, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF2, 0xF2, + 0xF2, 0xFF, 0xF3, 0xF3, 0xF4, 0xFF, 0xE5, 0xE4, 0xE2, 0xFF, 0x9D, 0x92, 0x7C, 0xFF, 0x96, 0x88, + 0x6E, 0xFF, 0xCE, 0xC8, 0xBE, 0xFF, 0xA3, 0x8E, 0x70, 0xFF, 0x7E, 0x53, 0x1A, 0xFF, 0x8D, 0x56, + 0x14, 0xFF, 0x9A, 0x5D, 0x17, 0xFF, 0x9D, 0x5E, 0x17, 0xFF, 0x9E, 0x5E, 0x17, 0xFF, 0x9E, 0x5E, + 0x17, 0xFF, 0x9E, 0x5E, 0x17, 0xFF, 0x9D, 0x5E, 0x17, 0xFF, 0x9D, 0x5D, 0x16, 0xFF, 0x9C, 0x5B, + 0x14, 0xFF, 0x9B, 0x5A, 0x12, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x9A, 0x58, 0x11, 0xFF, 0x99, 0x57, + 0x10, 0xFF, 0x96, 0x55, 0x0F, 0xFF, 0x93, 0x52, 0x10, 0xFF, 0xA4, 0x6F, 0x3A, 0xFF, 0xC0, 0x9D, + 0x79, 0x9E, 0x87, 0x96, 0xA1, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0xBD, 0xA2, 0x1E, 0xA8, 0x78, + 0x4B, 0xD9, 0x86, 0x47, 0x12, 0xFF, 0x86, 0x45, 0x0B, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x93, 0x52, + 0x0E, 0xFF, 0x99, 0x57, 0x11, 0xFF, 0x9D, 0x5D, 0x15, 0xFF, 0x9F, 0x60, 0x19, 0xFF, 0x9A, 0x61, + 0x1E, 0xFF, 0xC4, 0xAE, 0x91, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, + 0xEA, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xF0, 0xF0, 0xF1, 0xFF, 0xEB, 0xEB, 0xEA, 0xFF, 0xB0, 0xA7, + 0x95, 0xFF, 0x8D, 0x7E, 0x60, 0xFF, 0xCC, 0xC5, 0xBB, 0xFF, 0xB9, 0xAD, 0x99, 0xFF, 0x85, 0x61, + 0x2E, 0xFF, 0x8B, 0x57, 0x16, 0xFF, 0x9C, 0x60, 0x1A, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, + 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, + 0x1B, 0xFF, 0xA1, 0x62, 0x1A, 0xFF, 0x9F, 0x5F, 0x16, 0xFF, 0x9D, 0x5C, 0x12, 0xFF, 0x9C, 0x5B, + 0x11, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x97, 0x55, 0x0F, 0xFF, 0x9C, 0x5F, 0x20, 0xFF, 0xBA, 0x91, + 0x67, 0xCE, 0xD0, 0xBB, 0xA6, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCB, 0xAA, 0x88, 0x3C, 0xA3, 0x6F, + 0x3E, 0xF0, 0x87, 0x46, 0x0E, 0xFF, 0x8C, 0x49, 0x0C, 0xFF, 0x93, 0x51, 0x0E, 0xFF, 0x9A, 0x59, + 0x13, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA5, 0x66, 0x1F, 0xFF, 0xA6, 0x67, 0x1F, 0xFF, 0xA3, 0x66, + 0x1D, 0xFF, 0xA0, 0x6C, 0x2D, 0xFF, 0xCF, 0xC0, 0xAD, 0xFF, 0xE6, 0xE7, 0xE8, 0xFF, 0xE4, 0xE4, + 0xE4, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE6, 0xE6, + 0xE6, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEB, 0xEC, 0xFF, 0xEC, 0xEC, + 0xEC, 0xFF, 0xC2, 0xBC, 0xAF, 0xFF, 0x8C, 0x7C, 0x5C, 0xFF, 0xBF, 0xB7, 0xA9, 0xFF, 0xCD, 0xC5, + 0xBA, 0xFF, 0x91, 0x76, 0x4C, 0xFF, 0x88, 0x59, 0x1B, 0xFF, 0x9C, 0x62, 0x1D, 0xFF, 0xA4, 0x67, + 0x1F, 0xFF, 0xA6, 0x67, 0x1F, 0xFF, 0xA6, 0x67, 0x1F, 0xFF, 0xA5, 0x67, 0x1F, 0xFF, 0xA5, 0x67, + 0x1F, 0xFF, 0xA6, 0x67, 0x1F, 0xFF, 0xA5, 0x67, 0x1F, 0xFF, 0xA4, 0x65, 0x1C, 0xFF, 0xA1, 0x60, + 0x15, 0xFF, 0x9E, 0x5C, 0x12, 0xFF, 0x9B, 0x59, 0x10, 0xFF, 0x9B, 0x5B, 0x16, 0xFF, 0xB5, 0x87, + 0x54, 0xE9, 0xDA, 0xC1, 0xA5, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC7, 0xA2, 0x7C, 0x59, 0xA0, 0x68, + 0x34, 0xFC, 0x8B, 0x49, 0x0D, 0xFF, 0x92, 0x4F, 0x0E, 0xFF, 0x9B, 0x5B, 0x16, 0xFF, 0xA4, 0x66, + 0x20, 0xFF, 0xA8, 0x6B, 0x23, 0xFF, 0xAA, 0x6C, 0x24, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAA, 0x6D, + 0x24, 0xFF, 0xA6, 0x6A, 0x21, 0xFF, 0xA7, 0x7B, 0x42, 0xFF, 0xD4, 0xCD, 0xC1, 0xFF, 0xE0, 0xE1, + 0xE2, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xDE, 0xDF, 0xDF, 0xFF, 0xDF, 0xDF, + 0xDF, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE6, 0xE6, + 0xE6, 0xFF, 0xE9, 0xE9, 0xEA, 0xFF, 0xD0, 0xCC, 0xC4, 0xFF, 0x92, 0x82, 0x64, 0xFF, 0xB0, 0xA5, + 0x90, 0xFF, 0xD6, 0xD3, 0xCD, 0xFF, 0xA3, 0x90, 0x71, 0xFF, 0x89, 0x60, 0x25, 0xFF, 0x9B, 0x65, + 0x21, 0xFF, 0xA7, 0x6B, 0x23, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAA, 0x6D, + 0x24, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xA9, 0x6C, + 0x22, 0xFF, 0xA6, 0x65, 0x1A, 0xFF, 0xA0, 0x5E, 0x12, 0xFF, 0x9E, 0x5C, 0x13, 0xFF, 0xB3, 0x81, + 0x4A, 0xF6, 0xD5, 0xB7, 0x95, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0xA3, 0x7C, 0x6E, 0xA0, 0x65, + 0x2D, 0xFF, 0x90, 0x4D, 0x0D, 0xFF, 0x9C, 0x5B, 0x18, 0xFF, 0xA6, 0x69, 0x25, 0xFF, 0xAA, 0x6E, + 0x27, 0xFF, 0xAD, 0x70, 0x28, 0xFF, 0xAE, 0x72, 0x28, 0xFF, 0xAE, 0x72, 0x28, 0xFF, 0xAE, 0x72, + 0x28, 0xFF, 0xAE, 0x72, 0x28, 0xFF, 0xA8, 0x6E, 0x25, 0xFF, 0xB0, 0x8B, 0x5B, 0xFF, 0xD5, 0xD1, + 0xCC, 0xFF, 0xDA, 0xDA, 0xDB, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, 0xDC, 0xDC, + 0xDD, 0xFF, 0xCA, 0xC3, 0xB9, 0xFF, 0xA9, 0x97, 0x79, 0xFF, 0xD6, 0xD0, 0xC8, 0xFF, 0xE0, 0xE1, + 0xE2, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE5, 0xE5, 0xE6, 0xFF, 0xD9, 0xD7, 0xD3, 0xFF, 0x9E, 0x91, + 0x76, 0xFF, 0xA6, 0x99, 0x80, 0xFF, 0xD7, 0xD5, 0xD1, 0xFF, 0xB6, 0xAA, 0x95, 0xFF, 0x8E, 0x6B, + 0x37, 0xFF, 0x99, 0x66, 0x24, 0xFF, 0xA9, 0x6F, 0x28, 0xFF, 0xAE, 0x72, 0x28, 0xFF, 0xAE, 0x72, + 0x28, 0xFF, 0xAE, 0x72, 0x28, 0xFF, 0xAE, 0x72, 0x28, 0xFF, 0xAE, 0x72, 0x28, 0xFF, 0xAE, 0x72, + 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xA9, 0x69, 0x1E, 0xFF, 0xA2, 0x60, 0x13, 0xFF, 0xB3, 0x7E, + 0x43, 0xFC, 0xD3, 0xB2, 0x8E, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC9, 0xA3, 0x7B, 0x7A, 0xA2, 0x66, + 0x2B, 0xFF, 0x9A, 0x59, 0x1A, 0xFF, 0xA6, 0x6A, 0x29, 0xFF, 0xAC, 0x70, 0x2B, 0xFF, 0xAF, 0x73, + 0x2C, 0xFF, 0xB2, 0x76, 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB3, 0x77, + 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB2, 0x77, 0x2D, 0xFF, 0xAB, 0x73, 0x2B, 0xFF, 0xB7, 0x99, + 0x72, 0xFF, 0xD4, 0xD3, 0xD1, 0xFF, 0xD7, 0xD7, 0xD7, 0xFF, 0xD8, 0xD8, 0xD8, 0xFF, 0xDB, 0xDB, + 0xDC, 0xFF, 0xBC, 0xB6, 0xA7, 0xFF, 0x8D, 0x77, 0x4D, 0xFF, 0xC1, 0xB5, 0x9F, 0xFF, 0xDC, 0xD9, + 0xD5, 0xFF, 0xD8, 0xD5, 0xCF, 0xFF, 0xE1, 0xE0, 0xDE, 0xFF, 0xE4, 0xE4, 0xE5, 0xFF, 0xDF, 0xDE, + 0xDD, 0xFF, 0xB0, 0xA7, 0x92, 0xFF, 0xA3, 0x96, 0x7B, 0xFF, 0xD4, 0xD2, 0xCC, 0xFF, 0xC8, 0xC0, + 0xB5, 0xFF, 0x97, 0x7C, 0x50, 0xFF, 0x96, 0x69, 0x28, 0xFF, 0xAB, 0x73, 0x2C, 0xFF, 0xB2, 0x77, + 0x2D, 0xFF, 0xB2, 0x77, 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB3, 0x77, + 0x2D, 0xFF, 0xB2, 0x77, 0x2D, 0xFF, 0xB1, 0x75, 0x2D, 0xFF, 0xAB, 0x6C, 0x22, 0xFF, 0xB5, 0x80, + 0x41, 0xFF, 0xD4, 0xB3, 0x8D, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCB, 0xA5, 0x7C, 0x7B, 0xAA, 0x71, + 0x38, 0xFF, 0xA6, 0x69, 0x2C, 0xFF, 0xAC, 0x71, 0x2F, 0xFF, 0xB1, 0x76, 0x30, 0xFF, 0xB4, 0x79, + 0x31, 0xFF, 0xB6, 0x7C, 0x32, 0xFF, 0xB7, 0x7C, 0x32, 0xFF, 0xB7, 0x7C, 0x32, 0xFF, 0xB7, 0x7C, + 0x32, 0xFF, 0xB7, 0x7C, 0x32, 0xFF, 0xB7, 0x7C, 0x32, 0xFF, 0xB6, 0x7D, 0x34, 0xFF, 0xB3, 0x83, + 0x42, 0xFF, 0xC5, 0xB2, 0x98, 0xFF, 0xD7, 0xD7, 0xD7, 0xFF, 0xD7, 0xD7, 0xD7, 0xFF, 0xD7, 0xD7, + 0xD7, 0xFF, 0xD7, 0xD7, 0xD6, 0xFF, 0xD2, 0xD0, 0xC9, 0xFF, 0xB4, 0xA6, 0x8C, 0xFF, 0xB8, 0xA9, + 0x8D, 0xFF, 0xC7, 0xBD, 0xAB, 0xFF, 0xAE, 0x9F, 0x82, 0xFF, 0xC2, 0xB9, 0xA8, 0xFF, 0xE1, 0xE1, + 0xE2, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0xBE, 0xB8, 0xA9, 0xFF, 0xA4, 0x98, 0x7C, 0xFF, 0xD0, 0xCC, + 0xC4, 0xFF, 0xD4, 0xD1, 0xCC, 0xFF, 0xA5, 0x91, 0x6E, 0xFF, 0x98, 0x6E, 0x30, 0xFF, 0xAD, 0x78, + 0x31, 0xFF, 0xB6, 0x7C, 0x32, 0xFF, 0xB7, 0x7C, 0x32, 0xFF, 0xB7, 0x7C, 0x32, 0xFF, 0xB7, 0x7C, + 0x32, 0xFF, 0xB7, 0x7C, 0x32, 0xFF, 0xB6, 0x7B, 0x32, 0xFF, 0xB4, 0x79, 0x32, 0xFF, 0xBD, 0x8B, + 0x4F, 0xFF, 0xD6, 0xB5, 0x8F, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0xAD, 0x86, 0x71, 0xB6, 0x82, + 0x4C, 0xFF, 0xAC, 0x71, 0x33, 0xFF, 0xB2, 0x77, 0x35, 0xFF, 0xB6, 0x7C, 0x36, 0xFF, 0xB9, 0x7F, + 0x37, 0xFF, 0xBB, 0x81, 0x38, 0xFF, 0xBB, 0x82, 0x38, 0xFF, 0xBB, 0x82, 0x38, 0xFF, 0xBB, 0x82, + 0x38, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBC, 0x84, 0x3B, 0xFF, 0xC2, 0x8E, 0x4B, 0xFF, 0xC3, 0x93, + 0x54, 0xFF, 0xBD, 0x94, 0x5D, 0xFF, 0xCF, 0xC2, 0xB0, 0xFF, 0xDB, 0xDC, 0xDC, 0xFF, 0xDB, 0xDB, + 0xDB, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDD, 0xDD, 0xDE, 0xFF, 0xC9, 0xC2, 0xB4, 0xFF, 0xB7, 0xAB, + 0x91, 0xFF, 0xD9, 0xD5, 0xCC, 0xFF, 0xBA, 0xB1, 0x9C, 0xFF, 0xBD, 0xB6, 0xA5, 0xFF, 0xDC, 0xDD, + 0xDD, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xCC, 0xC8, 0xBD, 0xFF, 0xAA, 0x9F, + 0x86, 0xFF, 0xCD, 0xC8, 0xBE, 0xFF, 0xDD, 0xDC, 0xDA, 0xFF, 0xB5, 0xA4, 0x86, 0xFF, 0xA4, 0x79, + 0x39, 0xFF, 0xB7, 0x80, 0x37, 0xFF, 0xBB, 0x82, 0x38, 0xFF, 0xBB, 0x82, 0x38, 0xFF, 0xBB, 0x82, + 0x38, 0xFF, 0xBB, 0x82, 0x38, 0xFF, 0xBA, 0x81, 0x37, 0xFF, 0xB9, 0x80, 0x39, 0xFF, 0xC5, 0x97, + 0x5F, 0xFD, 0xDB, 0xBC, 0x98, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD4, 0xB2, 0x8A, 0x5E, 0xBD, 0x8C, + 0x57, 0xFD, 0xB2, 0x78, 0x39, 0xFF, 0xB6, 0x7D, 0x3A, 0xFF, 0xBA, 0x82, 0x3B, 0xFF, 0xBD, 0x85, + 0x3C, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBF, 0x87, + 0x3D, 0xFF, 0xC0, 0x88, 0x3F, 0xFF, 0xC7, 0x95, 0x53, 0xFF, 0xCB, 0x9C, 0x5E, 0xFF, 0xCB, 0x9B, + 0x5E, 0xFF, 0xC8, 0x99, 0x5C, 0xFF, 0xC3, 0xA0, 0x6E, 0xFF, 0xD8, 0xD0, 0xC3, 0xFF, 0xE1, 0xE1, + 0xE2, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xCF, 0xCA, 0xBE, 0xFF, 0xDA, 0xD7, + 0xCF, 0xFF, 0xBE, 0xB5, 0xA0, 0xFF, 0xD7, 0xD4, 0xCD, 0xFF, 0xDF, 0xDF, 0xE0, 0xFF, 0xDC, 0xDC, + 0xDC, 0xFF, 0xDC, 0xDC, 0xDC, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0xE4, 0xE4, 0xE5, 0xFF, 0xD8, 0xD5, + 0xD0, 0xFF, 0xB4, 0xAC, 0x95, 0xFF, 0xCC, 0xC8, 0xBC, 0xFF, 0xDF, 0xDC, 0xD7, 0xFF, 0xB0, 0x8C, + 0x57, 0xFF, 0xB9, 0x83, 0x3A, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBF, 0x87, + 0x3D, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBE, 0x86, 0x3D, 0xFF, 0xBE, 0x86, 0x3F, 0xFF, 0xCC, 0xA0, + 0x69, 0xF7, 0xDE, 0xC2, 0x9F, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD9, 0xB8, 0x91, 0x41, 0xC5, 0x97, + 0x63, 0xF3, 0xB8, 0x7F, 0x40, 0xFF, 0xBB, 0x82, 0x3F, 0xFF, 0xBF, 0x87, 0x41, 0xFF, 0xC2, 0x8A, + 0x42, 0xFF, 0xC3, 0x8C, 0x42, 0xFF, 0xC3, 0x8C, 0x42, 0xFF, 0xC3, 0x8C, 0x42, 0xFF, 0xC3, 0x8C, + 0x42, 0xFF, 0xC9, 0x97, 0x54, 0xFF, 0xCF, 0xA2, 0x67, 0xFF, 0xCF, 0xA2, 0x67, 0xFF, 0xCF, 0xA2, + 0x67, 0xFF, 0xCF, 0xA2, 0x67, 0xFF, 0xCC, 0xA0, 0x65, 0xFF, 0xCB, 0xAB, 0x7F, 0xFF, 0xE0, 0xDB, + 0xD4, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE7, 0xE7, 0xE8, 0xFF, 0xCA, 0xC2, 0xB1, 0xFF, 0xC8, 0xBD, + 0xA9, 0xFF, 0xD7, 0xD3, 0xC9, 0xFF, 0xBE, 0xB2, 0x9A, 0xFF, 0xC9, 0xBE, 0xAA, 0xFF, 0xDB, 0xDA, + 0xD6, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xE6, 0xE6, + 0xE6, 0xFF, 0xE1, 0xE0, 0xDD, 0xFF, 0xC4, 0xBD, 0xAC, 0xFF, 0xD2, 0xC9, 0xB6, 0xFF, 0xB8, 0x92, + 0x58, 0xFF, 0xBF, 0x89, 0x40, 0xFF, 0xC3, 0x8C, 0x42, 0xFF, 0xC3, 0x8C, 0x42, 0xFF, 0xC3, 0x8C, + 0x42, 0xFF, 0xC3, 0x8C, 0x42, 0xFF, 0xC2, 0x8B, 0x42, 0xFF, 0xC3, 0x8D, 0x47, 0xFF, 0xD2, 0xA9, + 0x75, 0xED, 0xE5, 0xCD, 0xAD, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE2, 0xC7, 0xA4, 0x24, 0xCE, 0xA2, + 0x70, 0xDF, 0xBF, 0x88, 0x4A, 0xFF, 0xC0, 0x88, 0x45, 0xFF, 0xC3, 0x8D, 0x47, 0xFF, 0xC7, 0x90, + 0x48, 0xFF, 0xC8, 0x92, 0x48, 0xFF, 0xC9, 0x92, 0x49, 0xFF, 0xC9, 0x92, 0x48, 0xFF, 0xCA, 0x96, + 0x4F, 0xFF, 0xD2, 0xA7, 0x6B, 0xFF, 0xD4, 0xA9, 0x70, 0xFF, 0xD4, 0xA9, 0x6F, 0xFF, 0xD4, 0xA9, + 0x6F, 0xFF, 0xD4, 0xA9, 0x6F, 0xFF, 0xD4, 0xA9, 0x6F, 0xFF, 0xD0, 0xA7, 0x6D, 0xFF, 0xD2, 0xB8, + 0x92, 0xFF, 0xE6, 0xE4, 0xE0, 0xFF, 0xEB, 0xEC, 0xED, 0xFF, 0xCA, 0xC4, 0xB4, 0xFF, 0xAC, 0xA0, + 0x80, 0xFF, 0xDD, 0xDA, 0xD3, 0xFF, 0xC0, 0xB7, 0xA2, 0xFF, 0xA9, 0x99, 0x74, 0xFF, 0xD5, 0xD1, + 0xC9, 0xFF, 0xE3, 0xE3, 0xE4, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE4, 0xE4, + 0xE4, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, 0xC7, 0xB5, 0x97, 0xFF, 0xB7, 0x8C, + 0x4B, 0xFF, 0xC3, 0x90, 0x47, 0xFF, 0xC8, 0x92, 0x49, 0xFF, 0xC9, 0x92, 0x49, 0xFF, 0xC9, 0x92, + 0x49, 0xFF, 0xC9, 0x92, 0x49, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xCA, 0x97, 0x53, 0xFF, 0xD8, 0xB2, + 0x82, 0xD4, 0xE4, 0xCE, 0xB1, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xED, 0xD9, 0xBE, 0x0A, 0xD6, 0xAE, + 0x7E, 0xB7, 0xC8, 0x93, 0x57, 0xFF, 0xC5, 0x8E, 0x4A, 0xFF, 0xC9, 0x92, 0x4C, 0xFF, 0xCC, 0x95, + 0x4D, 0xFF, 0xCD, 0x98, 0x4E, 0xFF, 0xCE, 0x98, 0x4E, 0xFF, 0xCE, 0x98, 0x4E, 0xFF, 0xD3, 0xA4, + 0x63, 0xFF, 0xD9, 0xB0, 0x79, 0xFF, 0xD9, 0xB0, 0x78, 0xFF, 0xD9, 0xB0, 0x78, 0xFF, 0xD9, 0xB0, + 0x78, 0xFF, 0xD9, 0xB0, 0x78, 0xFF, 0xD9, 0xB0, 0x78, 0xFF, 0xD9, 0xB0, 0x78, 0xFF, 0xD4, 0xAD, + 0x77, 0xFF, 0xD8, 0xC3, 0xA4, 0xFF, 0xEB, 0xE9, 0xE7, 0xFF, 0xEB, 0xEB, 0xEA, 0xFF, 0xE6, 0xE5, + 0xE2, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xE4, 0xE3, 0xE1, 0xFF, 0xD4, 0xD1, 0xC8, 0xFF, 0xDD, 0xDC, + 0xD8, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE7, 0xE7, + 0xE7, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xEA, 0xE9, 0xE6, 0xFF, 0xC3, 0xB8, 0x9D, 0xFF, 0xBC, 0xA1, + 0x72, 0xFF, 0xB9, 0x8F, 0x4C, 0xFF, 0xC7, 0x94, 0x4D, 0xFF, 0xCD, 0x98, 0x4E, 0xFF, 0xCE, 0x98, + 0x4E, 0xFF, 0xCE, 0x98, 0x4E, 0xFF, 0xCD, 0x97, 0x4E, 0xFF, 0xD2, 0xA2, 0x63, 0xFF, 0xDC, 0xBB, + 0x8E, 0xA9, 0xC0, 0xBC, 0xB7, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xBA, + 0x8D, 0x7B, 0xD1, 0xA1, 0x67, 0xFF, 0xCB, 0x94, 0x51, 0xFF, 0xCE, 0x98, 0x51, 0xFF, 0xD0, 0x9B, + 0x52, 0xFF, 0xD2, 0x9D, 0x53, 0xFF, 0xD2, 0x9E, 0x53, 0xFF, 0xD3, 0x9F, 0x55, 0xFF, 0xDB, 0xB1, + 0x75, 0xFF, 0xDD, 0xB8, 0x81, 0xFF, 0xDD, 0xB7, 0x80, 0xFF, 0xDD, 0xB7, 0x80, 0xFF, 0xDD, 0xB7, + 0x80, 0xFF, 0xDD, 0xB7, 0x80, 0xFF, 0xDD, 0xB7, 0x80, 0xFF, 0xDD, 0xB7, 0x80, 0xFF, 0xDD, 0xB7, + 0x80, 0xFF, 0xD8, 0xB4, 0x80, 0xFF, 0xDE, 0xCD, 0xB1, 0xFF, 0xEE, 0xEE, 0xED, 0xFF, 0xF0, 0xF1, + 0xF1, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEC, 0xEC, 0xED, 0xFF, 0xEA, 0xEA, + 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEB, + 0xEB, 0xFF, 0xE9, 0xE9, 0xE6, 0xFF, 0xEE, 0xEE, 0xED, 0xFF, 0xE5, 0xE3, 0xDD, 0xFF, 0xD2, 0xCA, + 0xB6, 0xFF, 0xC4, 0xB0, 0x89, 0xFF, 0xBD, 0x96, 0x56, 0xFF, 0xCE, 0x9C, 0x53, 0xFF, 0xD2, 0x9E, + 0x53, 0xFF, 0xD2, 0x9E, 0x53, 0xFF, 0xD2, 0x9E, 0x55, 0xFF, 0xDA, 0xB0, 0x76, 0xFE, 0xDE, 0xC1, + 0x9A, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE5, 0xC8, + 0x9E, 0x36, 0xDA, 0xAF, 0x79, 0xEA, 0xD1, 0x9D, 0x5B, 0xFF, 0xD2, 0x9D, 0x57, 0xFF, 0xD5, 0xA0, + 0x58, 0xFF, 0xD6, 0xA3, 0x59, 0xFF, 0xD7, 0xA3, 0x59, 0xFF, 0xD8, 0xA7, 0x60, 0xFF, 0xE1, 0xBB, + 0x83, 0xFF, 0xE2, 0xBE, 0x89, 0xFF, 0xE2, 0xBE, 0x88, 0xFF, 0xE2, 0xBE, 0x88, 0xFF, 0xE2, 0xBE, + 0x88, 0xFF, 0xE2, 0xBE, 0x88, 0xFF, 0xE2, 0xBE, 0x88, 0xFF, 0xE2, 0xBE, 0x88, 0xFF, 0xE2, 0xBE, + 0x88, 0xFF, 0xE1, 0xBD, 0x88, 0xFF, 0xDC, 0xBB, 0x89, 0xFF, 0xE3, 0xD5, 0xBC, 0xFF, 0xF1, 0xF1, + 0xF0, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEE, 0xEE, 0xED, 0xFF, 0xE9, 0xE9, + 0xE6, 0xFF, 0xED, 0xED, 0xEB, 0xFF, 0xEF, 0xEF, 0xF0, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xEB, 0xEA, + 0xE6, 0xFF, 0xE2, 0xDE, 0xD3, 0xFF, 0xCB, 0xAE, 0x7E, 0xFF, 0xCF, 0x9F, 0x56, 0xFF, 0xD7, 0xA4, + 0x59, 0xFF, 0xD7, 0xA3, 0x59, 0xFF, 0xD8, 0xA8, 0x62, 0xFF, 0xE1, 0xBC, 0x89, 0xE3, 0xE0, 0xC8, + 0xA6, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xDF, + 0xC2, 0x08, 0xE1, 0xBB, 0x8A, 0xAC, 0xD9, 0xA9, 0x6C, 0xFF, 0xD6, 0xA2, 0x5D, 0xFF, 0xD9, 0xA5, + 0x5E, 0xFF, 0xDA, 0xA8, 0x5F, 0xFF, 0xDB, 0xA9, 0x5E, 0xFF, 0xDD, 0xAE, 0x69, 0xFF, 0xE6, 0xC2, + 0x8E, 0xFF, 0xE7, 0xC4, 0x91, 0xFF, 0xE7, 0xC4, 0x91, 0xFF, 0xE7, 0xC4, 0x91, 0xFF, 0xE7, 0xC4, + 0x91, 0xFF, 0xE7, 0xC4, 0x91, 0xFF, 0xE7, 0xC4, 0x91, 0xFF, 0xE7, 0xC4, 0x91, 0xFF, 0xE7, 0xC4, + 0x91, 0xFF, 0xE7, 0xC4, 0x91, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE0, 0xC2, 0x93, 0xFF, 0xE7, 0xDB, + 0xC4, 0xFF, 0xF4, 0xF3, 0xF3, 0xFF, 0xF4, 0xF4, 0xF4, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF2, 0xF2, + 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xEE, 0xEE, 0xEC, 0xFF, 0xF0, 0xF0, + 0xEF, 0xFF, 0xF2, 0xF2, 0xF3, 0xFF, 0xF1, 0xF0, 0xEF, 0xFF, 0xD8, 0xD5, 0xC7, 0xFF, 0xEE, 0xEE, + 0xEB, 0xFF, 0xEC, 0xE9, 0xE1, 0xFF, 0xD0, 0xAF, 0x79, 0xFF, 0xD6, 0xA6, 0x5D, 0xFF, 0xDC, 0xA9, + 0x5F, 0xFF, 0xDB, 0xA9, 0x60, 0xFF, 0xE0, 0xB5, 0x76, 0xFF, 0xE7, 0xC8, 0x99, 0x9E, 0xD9, 0xD3, + 0xC8, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xE3, 0xC2, 0x96, 0x4D, 0xE1, 0xB7, 0x7F, 0xF3, 0xDC, 0xA9, 0x66, 0xFF, 0xDC, 0xAA, + 0x63, 0xFF, 0xDE, 0xAD, 0x64, 0xFF, 0xDF, 0xAE, 0x64, 0xFF, 0xE1, 0xB4, 0x6E, 0xFF, 0xE9, 0xC9, + 0x95, 0xFF, 0xEA, 0xCA, 0x98, 0xFF, 0xEA, 0xCA, 0x98, 0xFF, 0xEA, 0xCA, 0x98, 0xFF, 0xEA, 0xCA, + 0x98, 0xFF, 0xEA, 0xCA, 0x98, 0xFF, 0xEA, 0xCA, 0x98, 0xFF, 0xEA, 0xCA, 0x98, 0xFF, 0xEA, 0xCA, + 0x98, 0xFF, 0xEA, 0xCA, 0x98, 0xFF, 0xEA, 0xCA, 0x98, 0xFF, 0xE9, 0xC9, 0x97, 0xFF, 0xE4, 0xC8, + 0x9A, 0xFF, 0xEA, 0xDD, 0xC8, 0xFF, 0xF5, 0xF5, 0xF4, 0xFF, 0xF6, 0xF6, 0xF7, 0xFF, 0xF6, 0xF6, + 0xF6, 0xFF, 0xF4, 0xF3, 0xF2, 0xFF, 0xF4, 0xF4, 0xF2, 0xFF, 0xF5, 0xF5, 0xF5, 0xFF, 0xF5, 0xF5, + 0xF5, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xF2, 0xF2, 0xF0, 0xFF, 0xE9, 0xE8, 0xE2, 0xFF, 0xF3, 0xF1, + 0xEC, 0xFF, 0xD7, 0xBE, 0x93, 0xFF, 0xD5, 0xA9, 0x63, 0xFF, 0xDE, 0xAE, 0x64, 0xFF, 0xDF, 0xAE, + 0x65, 0xFF, 0xE0, 0xB2, 0x6C, 0xFF, 0xE7, 0xC3, 0x8D, 0xED, 0xE8, 0xCE, 0xA7, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xE2, 0xCC, 0xAB, 0x0A, 0xE7, 0xC3, 0x90, 0xA9, 0xE3, 0xB5, 0x79, 0xFF, 0xE0, 0xAE, + 0x69, 0xFF, 0xE1, 0xB1, 0x69, 0xFF, 0xE2, 0xB2, 0x69, 0xFF, 0xE4, 0xB7, 0x71, 0xFF, 0xEC, 0xCC, + 0x99, 0xFF, 0xED, 0xCF, 0xA0, 0xFF, 0xED, 0xCF, 0x9F, 0xFF, 0xED, 0xCF, 0x9F, 0xFF, 0xED, 0xCF, + 0x9F, 0xFF, 0xED, 0xCF, 0x9F, 0xFF, 0xED, 0xCF, 0x9F, 0xFF, 0xED, 0xCF, 0x9F, 0xFF, 0xED, 0xCF, + 0x9F, 0xFF, 0xED, 0xCF, 0x9F, 0xFF, 0xED, 0xCF, 0x9F, 0xFF, 0xED, 0xCF, 0x9F, 0xFF, 0xEC, 0xCF, + 0x9F, 0xFF, 0xE8, 0xCD, 0xA0, 0xFF, 0xEB, 0xDD, 0xC3, 0xFF, 0xF6, 0xF4, 0xEF, 0xFF, 0xF5, 0xF2, + 0xEC, 0xFF, 0xE5, 0xD7, 0xBC, 0xFF, 0xEA, 0xDD, 0xC5, 0xFF, 0xF8, 0xF6, 0xF4, 0xFF, 0xF8, 0xF9, + 0xF9, 0xFF, 0xEA, 0xE9, 0xE1, 0xFF, 0xF4, 0xF4, 0xF2, 0xFF, 0xF9, 0xF8, 0xF6, 0xFF, 0xE5, 0xD6, + 0xB6, 0xFF, 0xD9, 0xB0, 0x6D, 0xFF, 0xE1, 0xB3, 0x69, 0xFF, 0xE3, 0xB4, 0x6A, 0xFF, 0xE3, 0xB4, + 0x6C, 0xFF, 0xE7, 0xBF, 0x82, 0xFF, 0xEC, 0xCE, 0x9F, 0x9B, 0xE1, 0xD6, 0xC5, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA, 0xCB, 0x9E, 0x36, 0xE9, 0xC3, 0x8D, 0xE3, 0xE5, 0xB7, + 0x76, 0xFF, 0xE4, 0xB5, 0x6E, 0xFF, 0xE6, 0xB7, 0x6F, 0xFF, 0xE7, 0xB9, 0x72, 0xFF, 0xEE, 0xCD, + 0x98, 0xFF, 0xF0, 0xD4, 0xA7, 0xFF, 0xF0, 0xD4, 0xA6, 0xFF, 0xF0, 0xD4, 0xA6, 0xFF, 0xF0, 0xD4, + 0xA6, 0xFF, 0xF0, 0xD4, 0xA6, 0xFF, 0xF0, 0xD4, 0xA6, 0xFF, 0xF0, 0xD4, 0xA6, 0xFF, 0xF0, 0xD4, + 0xA6, 0xFF, 0xF0, 0xD4, 0xA6, 0xFF, 0xF0, 0xD4, 0xA6, 0xFF, 0xF0, 0xD4, 0xA6, 0xFF, 0xF0, 0xD4, + 0xA6, 0xFF, 0xF0, 0xD4, 0xA6, 0xFF, 0xED, 0xD2, 0xA5, 0xFF, 0xED, 0xD8, 0xB4, 0xFF, 0xEC, 0xD7, + 0xB3, 0xFF, 0xEB, 0xD1, 0xA4, 0xFF, 0xEB, 0xD1, 0xA5, 0xFF, 0xEE, 0xDF, 0xC3, 0xFF, 0xF8, 0xF6, + 0xF0, 0xFF, 0xEB, 0xEA, 0xE2, 0xFF, 0xF6, 0xF5, 0xF2, 0xFF, 0xEC, 0xE1, 0xCA, 0xFF, 0xE5, 0xC7, + 0x94, 0xFF, 0xE5, 0xB8, 0x70, 0xFF, 0xE6, 0xB8, 0x6F, 0xFF, 0xE7, 0xB8, 0x70, 0xFF, 0xE8, 0xBE, + 0x7C, 0xFF, 0xED, 0xCD, 0x98, 0xDA, 0xED, 0xD4, 0xAD, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xED, 0xCD, 0x9C, 0x6D, 0xEB, 0xC4, + 0x8C, 0xF8, 0xE8, 0xBB, 0x78, 0xFF, 0xE8, 0xBA, 0x73, 0xFF, 0xE9, 0xBB, 0x73, 0xFF, 0xEE, 0xCA, + 0x8F, 0xFF, 0xF2, 0xD8, 0xAD, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF2, 0xD8, + 0xAC, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF2, 0xD8, + 0xAC, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF2, 0xD8, + 0xAC, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, + 0xAB, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xEF, 0xD6, 0xAB, 0xFF, 0xF0, 0xDF, + 0xC0, 0xFF, 0xF9, 0xF5, 0xEE, 0xFF, 0xF1, 0xE7, 0xD2, 0xFF, 0xEB, 0xD5, 0xAC, 0xFF, 0xEC, 0xC8, + 0x8B, 0xFF, 0xE9, 0xBC, 0x73, 0xFF, 0xEA, 0xBD, 0x74, 0xFF, 0xEB, 0xC0, 0x7C, 0xFF, 0xEE, 0xCD, + 0x95, 0xF4, 0xEF, 0xD5, 0xA9, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA, 0xD6, 0xB4, 0x0A, 0xF0, 0xCF, + 0x9C, 0x94, 0xEE, 0xC8, 0x8D, 0xFE, 0xEB, 0xBF, 0x7C, 0xFF, 0xEC, 0xBF, 0x77, 0xFF, 0xED, 0xC4, + 0x81, 0xFF, 0xF4, 0xD8, 0xAB, 0xFF, 0xF5, 0xDC, 0xB3, 0xFF, 0xF5, 0xDC, 0xB2, 0xFF, 0xF5, 0xDC, + 0xB2, 0xFF, 0xF5, 0xDC, 0xB2, 0xFF, 0xF5, 0xDC, 0xB2, 0xFF, 0xF5, 0xDC, 0xB2, 0xFF, 0xF5, 0xDC, + 0xB2, 0xFF, 0xF5, 0xDC, 0xB2, 0xFF, 0xF5, 0xDC, 0xB2, 0xFF, 0xF5, 0xDC, 0xB2, 0xFF, 0xF5, 0xDC, + 0xB2, 0xFF, 0xF5, 0xDC, 0xB2, 0xFF, 0xF5, 0xDC, 0xB2, 0xFF, 0xF5, 0xDC, 0xB2, 0xFF, 0xF5, 0xDC, + 0xB2, 0xFF, 0xF5, 0xDC, 0xB2, 0xFF, 0xF5, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF2, 0xDB, + 0xB1, 0xFF, 0xF2, 0xDE, 0xB9, 0xFF, 0xF1, 0xDB, 0xB5, 0xFF, 0xF2, 0xD7, 0xA8, 0xFF, 0xED, 0xC4, + 0x7F, 0xFF, 0xEC, 0xC0, 0x78, 0xFF, 0xED, 0xC3, 0x7F, 0xFF, 0xF0, 0xCE, 0x94, 0xFB, 0xF2, 0xD6, + 0xA7, 0x87, 0xEB, 0xDE, 0xC5, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xD7, + 0xAB, 0x12, 0xF2, 0xD2, 0x9E, 0xA4, 0xF0, 0xCB, 0x90, 0xFF, 0xEF, 0xC4, 0x81, 0xFF, 0xEF, 0xC3, + 0x7D, 0xFF, 0xF3, 0xD0, 0x97, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF7, 0xE0, + 0xB8, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF7, 0xE0, + 0xB8, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF7, 0xE0, + 0xB8, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF7, 0xE0, + 0xB8, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF6, 0xE0, 0xB8, 0xFF, 0xF6, 0xE0, + 0xB8, 0xFF, 0xF6, 0xE0, 0xB8, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF2, 0xD0, 0x94, 0xFF, 0xEF, 0xC4, + 0x7D, 0xFF, 0xF0, 0xC8, 0x83, 0xFF, 0xF3, 0xD1, 0x96, 0xFE, 0xF3, 0xD8, 0xA7, 0x99, 0xF1, 0xDD, + 0xBB, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF2, 0xD9, 0xAE, 0x17, 0xF4, 0xD4, 0xA1, 0xA1, 0xF3, 0xD0, 0x95, 0xFD, 0xF1, 0xCA, + 0x87, 0xFF, 0xF2, 0xC9, 0x84, 0xFF, 0xF5, 0xD9, 0xA6, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF5, 0xD8, 0xA4, 0xFF, 0xF2, 0xCA, 0x84, 0xFF, 0xF3, 0xCD, + 0x8A, 0xFF, 0xF5, 0xD4, 0x9B, 0xFB, 0xF6, 0xDA, 0xA9, 0x98, 0xF2, 0xDE, 0xBC, 0x13, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0xDC, 0xB3, 0x10, 0xF5, 0xD7, 0xA5, 0x87, 0xF5, 0xD4, + 0x9C, 0xF1, 0xF4, 0xCF, 0x90, 0xFF, 0xF4, 0xCE, 0x8C, 0xFF, 0xF7, 0xDC, 0xAB, 0xFF, 0xFA, 0xE6, + 0xC1, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xFA, 0xE6, + 0xC1, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xFA, 0xE6, + 0xC1, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xFA, 0xE6, + 0xC1, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xF7, 0xDB, 0xA9, 0xFF, 0xF4, 0xCF, 0x8C, 0xFF, 0xF5, 0xD1, 0x93, 0xFF, 0xF7, 0xD8, + 0xA2, 0xED, 0xF7, 0xDC, 0xAC, 0x7B, 0xF4, 0xE1, 0xC0, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0xE0, 0xC7, 0x05, 0xF5, 0xD9, + 0xA9, 0x56, 0xF7, 0xD8, 0xA3, 0xCC, 0xF7, 0xD5, 0x9A, 0xFF, 0xF6, 0xD2, 0x94, 0xFF, 0xF8, 0xDB, + 0xA8, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, + 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, + 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC5, 0xFF, 0xFB, 0xE8, + 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFA, 0xE5, 0xC0, 0xFF, 0xF8, 0xDB, + 0xA6, 0xFF, 0xF7, 0xD4, 0x95, 0xFF, 0xF7, 0xD7, 0x9E, 0xFE, 0xF8, 0xDB, 0xA8, 0xC5, 0xF8, 0xDE, + 0xB1, 0x4D, 0xFB, 0xEF, 0xDA, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF4, 0xDB, 0xB0, 0x1E, 0xF7, 0xDB, 0xA9, 0x82, 0xF8, 0xDA, 0xA4, 0xDD, 0xF8, 0xD7, + 0x9E, 0xFF, 0xF9, 0xDA, 0xA4, 0xFF, 0xFB, 0xE2, 0xB7, 0xFF, 0xFC, 0xE8, 0xC5, 0xFF, 0xFC, 0xEA, + 0xCB, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, + 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, + 0xCB, 0xFF, 0xFC, 0xE8, 0xC4, 0xFF, 0xFB, 0xE2, 0xB6, 0xFF, 0xF9, 0xDB, 0xA3, 0xFF, 0xF9, 0xD9, + 0xA0, 0xFE, 0xF9, 0xDC, 0xA8, 0xD9, 0xF8, 0xDE, 0xAE, 0x79, 0xF8, 0xE2, 0xB9, 0x19, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFA, 0xFF, 0x01, 0xF7, 0xDD, 0xB1, 0x28, 0xF8, 0xDD, + 0xAC, 0x78, 0xF9, 0xDC, 0xA8, 0xC5, 0xFA, 0xDC, 0xA6, 0xF0, 0xFB, 0xDE, 0xAB, 0xFF, 0xFB, 0xE2, + 0xB5, 0xFF, 0xFC, 0xE6, 0xBF, 0xFF, 0xFC, 0xE8, 0xC4, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xEA, + 0xC9, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xE8, 0xC4, 0xFF, 0xFB, 0xE6, 0xBE, 0xFF, 0xFB, 0xE2, + 0xB5, 0xFF, 0xFA, 0xDF, 0xAC, 0xFF, 0xFA, 0xDD, 0xA8, 0xEE, 0xFA, 0xDE, 0xAA, 0xC0, 0xF9, 0xDE, + 0xAF, 0x73, 0xF7, 0xE0, 0xB6, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFA, 0xE6, 0xC1, 0x12, 0xFB, 0xE2, 0xB5, 0x3E, 0xFB, 0xE0, 0xAF, 0x73, 0xFB, 0xDF, + 0xAC, 0xA1, 0xFB, 0xDF, 0xAC, 0xC1, 0xFB, 0xE0, 0xAF, 0xD6, 0xFB, 0xE1, 0xB0, 0xDE, 0xFB, 0xE1, + 0xB1, 0xE1, 0xFB, 0xE1, 0xB0, 0xDE, 0xFB, 0xE0, 0xAF, 0xD5, 0xFB, 0xE0, 0xAD, 0xBF, 0xFB, 0xDF, + 0xAD, 0x9E, 0xFB, 0xE1, 0xB2, 0x6F, 0xFB, 0xE3, 0xB8, 0x3A, 0xFA, 0xE7, 0xC5, 0x0F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xEA, + 0xCA, 0x04, 0xFB, 0xE2, 0xB2, 0x0F, 0xFC, 0xE2, 0xB3, 0x1F, 0xFC, 0xE2, 0xB2, 0x29, 0xFC, 0xE2, + 0xB2, 0x2D, 0xFC, 0xE2, 0xB3, 0x29, 0xFB, 0xE3, 0xB3, 0x1E, 0xFB, 0xE3, 0xB5, 0x0E, 0xFD, 0xEE, + 0xD3, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, + 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xF8, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xF8, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0xFE, 0x00, + 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0xF8, 0x00, + 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0xF8, 0x00, + 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0xFE, 0x00, + 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xC0, + 0x00, 0x00, 0x01, 0xFF, 0x00, 0x00, 0xFF, 0xE0, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, 0xFF, 0xF8, + 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0xFF, 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0xFF, 0xFF, + 0x80, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0x00, 0x00, 0x28, 0x00, + 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, + 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, + 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x10, 0x82, 0x44, 0x0C, 0x12, 0x82, 0x44, + 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, + 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x12, 0x82, 0x44, 0x0C, 0x10, 0x82, 0x44, + 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, + 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, + 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, 0x0C, 0x1D, 0x82, 0x44, 0x0C, 0x24, 0x82, 0x44, + 0x0C, 0x2B, 0x82, 0x44, 0x0C, 0x30, 0x82, 0x44, 0x0C, 0x35, 0x82, 0x44, 0x0C, 0x39, 0x82, 0x44, + 0x0C, 0x3B, 0x82, 0x44, 0x0C, 0x3D, 0x82, 0x44, 0x0C, 0x3E, 0x82, 0x44, 0x0C, 0x3E, 0x82, 0x44, + 0x0C, 0x3D, 0x82, 0x44, 0x0C, 0x3A, 0x82, 0x44, 0x0C, 0x37, 0x82, 0x44, 0x0C, 0x34, 0x82, 0x44, + 0x0C, 0x2E, 0x82, 0x44, 0x0C, 0x29, 0x82, 0x44, 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x1A, 0x82, 0x44, + 0x0C, 0x11, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, + 0x0C, 0x28, 0x82, 0x44, 0x0C, 0x3D, 0x82, 0x44, 0x0C, 0x4E, 0x82, 0x44, 0x0C, 0x5A, 0x82, 0x44, + 0x0C, 0x64, 0x82, 0x44, 0x0B, 0x6C, 0x81, 0x43, 0x0A, 0x71, 0x81, 0x43, 0x0A, 0x75, 0x82, 0x44, + 0x0B, 0x78, 0x83, 0x45, 0x0D, 0x7B, 0x83, 0x46, 0x0E, 0x7C, 0x83, 0x45, 0x0D, 0x7B, 0x82, 0x43, + 0x0A, 0x7A, 0x81, 0x42, 0x09, 0x77, 0x81, 0x43, 0x0B, 0x74, 0x82, 0x44, 0x0C, 0x6F, 0x82, 0x44, + 0x0C, 0x69, 0x82, 0x44, 0x0C, 0x61, 0x82, 0x44, 0x0C, 0x56, 0x82, 0x44, 0x0C, 0x48, 0x82, 0x44, + 0x0C, 0x35, 0x82, 0x44, 0x0C, 0x20, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0D, 0x04, 0x97, 0x64, + 0x35, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x82, 0x45, 0x0D, 0x03, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x26, 0x82, 0x44, + 0x0C, 0x49, 0x82, 0x44, 0x0C, 0x6A, 0x82, 0x44, 0x0C, 0x81, 0x82, 0x43, 0x0B, 0x8F, 0x82, 0x43, + 0x0B, 0x98, 0x85, 0x49, 0x12, 0xA2, 0x8A, 0x51, 0x1E, 0xAE, 0x8F, 0x5B, 0x2E, 0xBD, 0x94, 0x65, + 0x3F, 0xCE, 0x96, 0x6A, 0x48, 0xD9, 0x96, 0x6A, 0x49, 0xDB, 0x97, 0x6B, 0x48, 0xD7, 0x94, 0x64, + 0x3C, 0xC9, 0x8E, 0x58, 0x2A, 0xB9, 0x88, 0x4E, 0x1A, 0xAD, 0x83, 0x46, 0x0F, 0xA3, 0x81, 0x43, + 0x0A, 0x9C, 0x82, 0x44, 0x0C, 0x96, 0x82, 0x44, 0x0C, 0x8B, 0x82, 0x44, 0x0C, 0x7A, 0x82, 0x44, + 0x0C, 0x5F, 0x82, 0x44, 0x0C, 0x3B, 0x82, 0x44, 0x0C, 0x1B, 0x82, 0x44, 0x0C, 0x08, 0x85, 0x48, + 0x12, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x83, 0x45, 0x0D, 0x03, 0x82, 0x44, 0x0C, 0x0F, 0x82, 0x44, 0x0C, 0x2B, 0x82, 0x44, + 0x0C, 0x52, 0x82, 0x44, 0x0C, 0x76, 0x82, 0x43, 0x0B, 0x8D, 0x86, 0x4B, 0x14, 0xA2, 0x8F, 0x5C, + 0x30, 0xC4, 0x8E, 0x61, 0x3F, 0xE7, 0x82, 0x55, 0x37, 0xF6, 0x7B, 0x4E, 0x32, 0xFD, 0x78, 0x4B, + 0x31, 0xFF, 0x78, 0x4B, 0x31, 0xFF, 0x79, 0x4D, 0x32, 0xFF, 0x7C, 0x51, 0x36, 0xFF, 0x80, 0x55, + 0x3B, 0xFF, 0x86, 0x5C, 0x40, 0xFB, 0x90, 0x65, 0x48, 0xF3, 0x97, 0x6B, 0x47, 0xE0, 0x8E, 0x58, + 0x28, 0xBC, 0x84, 0x47, 0x0F, 0xA4, 0x81, 0x43, 0x0B, 0x97, 0x82, 0x44, 0x0C, 0x87, 0x82, 0x44, + 0x0C, 0x6A, 0x82, 0x44, 0x0C, 0x43, 0x82, 0x44, 0x0C, 0x1E, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, + 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x1D, 0x81, 0x43, + 0x0A, 0x38, 0x84, 0x47, 0x0F, 0x55, 0x91, 0x5D, 0x30, 0x90, 0x8B, 0x5D, 0x3B, 0xDF, 0x77, 0x48, + 0x2B, 0xFC, 0x6D, 0x3D, 0x20, 0xFF, 0x6C, 0x3B, 0x1C, 0xFF, 0x70, 0x3E, 0x1E, 0xFF, 0x73, 0x42, + 0x21, 0xFF, 0x77, 0x45, 0x24, 0xFF, 0x79, 0x48, 0x27, 0xFF, 0x7B, 0x4A, 0x29, 0xFF, 0x7C, 0x4C, + 0x2B, 0xFF, 0x7C, 0x4D, 0x2D, 0xFF, 0x7E, 0x50, 0x32, 0xFF, 0x84, 0x58, 0x3B, 0xFF, 0x8F, 0x65, + 0x48, 0xF7, 0x9A, 0x6E, 0x4B, 0xCF, 0x8D, 0x56, 0x24, 0x85, 0x81, 0x43, 0x0A, 0x60, 0x82, 0x44, + 0x0C, 0x4A, 0x82, 0x44, 0x0C, 0x2E, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, 0x0C, 0x06, 0x89, 0x4F, + 0x1A, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x83, 0x46, 0x0E, 0x01, 0x82, 0x45, 0x0D, 0x04, 0x7D, 0x3C, 0x01, 0x0A, 0x92, 0x5C, + 0x2A, 0x1E, 0x95, 0x68, 0x45, 0x88, 0x7A, 0x49, 0x29, 0xEF, 0x66, 0x31, 0x12, 0xFF, 0x63, 0x2D, + 0x0B, 0xFF, 0x69, 0x31, 0x0C, 0xFF, 0x6E, 0x36, 0x0E, 0xFF, 0x73, 0x3B, 0x11, 0xFF, 0x78, 0x40, + 0x14, 0xFF, 0x7D, 0x46, 0x1A, 0xFF, 0x81, 0x4B, 0x20, 0xFF, 0x84, 0x4F, 0x25, 0xFF, 0x86, 0x52, + 0x29, 0xFF, 0x87, 0x54, 0x2C, 0xFF, 0x86, 0x54, 0x2E, 0xFF, 0x84, 0x53, 0x2F, 0xFF, 0x83, 0x53, + 0x32, 0xFF, 0x8A, 0x5D, 0x3F, 0xFF, 0x9A, 0x71, 0x52, 0xDC, 0x9F, 0x73, 0x4C, 0x63, 0x82, 0x43, + 0x0A, 0x1F, 0x81, 0x43, 0x0A, 0x13, 0x82, 0x44, 0x0C, 0x08, 0x83, 0x45, 0x0D, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBE, 0x9B, 0x7C, 0x09, 0x98, 0x6D, + 0x4D, 0x85, 0x74, 0x40, 0x1E, 0xF7, 0x62, 0x2B, 0x07, 0xFF, 0x66, 0x2C, 0x05, 0xFF, 0x69, 0x2F, + 0x05, 0xFF, 0x70, 0x35, 0x06, 0xFF, 0x77, 0x3A, 0x09, 0xFF, 0x7B, 0x3D, 0x09, 0xFF, 0x7D, 0x3F, + 0x0A, 0xFF, 0x7E, 0x40, 0x0B, 0xFF, 0x80, 0x42, 0x0C, 0xFF, 0x81, 0x44, 0x0F, 0xFF, 0x84, 0x48, + 0x13, 0xFF, 0x88, 0x4F, 0x1D, 0xFF, 0x8C, 0x56, 0x28, 0xFF, 0x8D, 0x59, 0x2D, 0xFF, 0x8B, 0x59, + 0x2F, 0xFF, 0x88, 0x57, 0x30, 0xFF, 0x89, 0x5B, 0x38, 0xFF, 0x9B, 0x72, 0x52, 0xE2, 0xAE, 0x8A, + 0x6C, 0x4F, 0x76, 0x2C, 0x00, 0x03, 0x7A, 0x38, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x02, 0x9F, 0x76, 0x55, 0x71, 0x78, 0x43, + 0x1F, 0xF7, 0x67, 0x2D, 0x07, 0xFF, 0x6B, 0x30, 0x06, 0xFF, 0x6C, 0x37, 0x0C, 0xFF, 0x7F, 0x59, + 0x36, 0xFF, 0x79, 0x4D, 0x23, 0xFF, 0x79, 0x3E, 0x09, 0xFF, 0x84, 0x45, 0x0B, 0xFF, 0x86, 0x46, + 0x0C, 0xFF, 0x86, 0x46, 0x0C, 0xFF, 0x86, 0x46, 0x0C, 0xFF, 0x86, 0x46, 0x0C, 0xFF, 0x86, 0x46, + 0x0B, 0xFF, 0x86, 0x46, 0x0C, 0xFF, 0x87, 0x48, 0x10, 0xFF, 0x8A, 0x4E, 0x17, 0xFF, 0x90, 0x58, + 0x26, 0xFF, 0x91, 0x5C, 0x2E, 0xFF, 0x8E, 0x5B, 0x30, 0xFF, 0x8D, 0x5D, 0x37, 0xFF, 0xA0, 0x76, + 0x55, 0xDC, 0xBA, 0x99, 0x7E, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAA, 0x83, 0x62, 0x42, 0x82, 0x4F, 0x29, 0xEB, 0x6B, 0x30, + 0x08, 0xFF, 0x70, 0x34, 0x07, 0xFF, 0x71, 0x3D, 0x10, 0xFF, 0xA7, 0x91, 0x7B, 0xFF, 0xCA, 0xC3, + 0xBB, 0xFF, 0xB6, 0xAB, 0x9B, 0xFF, 0x8A, 0x67, 0x41, 0xFF, 0x7C, 0x45, 0x0D, 0xFF, 0x88, 0x49, + 0x0C, 0xFF, 0x8B, 0x4A, 0x0D, 0xFF, 0x8B, 0x4A, 0x0D, 0xFF, 0x8B, 0x4A, 0x0D, 0xFF, 0x8B, 0x4A, + 0x0D, 0xFF, 0x8B, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, 0x0C, 0xFF, 0x8A, 0x4B, + 0x0F, 0xFF, 0x8D, 0x51, 0x17, 0xFF, 0x93, 0x5B, 0x28, 0xFF, 0x92, 0x5D, 0x30, 0xFF, 0x93, 0x62, + 0x39, 0xFF, 0xA9, 0x81, 0x5F, 0xC2, 0xC7, 0xAA, 0x91, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xC3, 0xA2, 0x84, 0x13, 0x96, 0x66, 0x40, 0xBF, 0x72, 0x37, 0x0E, 0xFF, 0x74, 0x36, + 0x08, 0xFF, 0x75, 0x3E, 0x0E, 0xFF, 0xA7, 0x90, 0x78, 0xFF, 0xE4, 0xE3, 0xE2, 0xFF, 0xE5, 0xE5, + 0xE4, 0xFF, 0xCE, 0xCA, 0xC3, 0xFF, 0xAD, 0xA3, 0x93, 0xFF, 0x9D, 0x84, 0x66, 0xFF, 0x7E, 0x4C, + 0x15, 0xFF, 0x88, 0x4A, 0x0C, 0xFF, 0x8E, 0x4E, 0x0E, 0xFF, 0x8E, 0x4E, 0x0E, 0xFF, 0x8E, 0x4E, + 0x0E, 0xFF, 0x8E, 0x4E, 0x0E, 0xFF, 0x8E, 0x4E, 0x0E, 0xFF, 0x8E, 0x4E, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8D, 0x4D, 0x0D, 0xFF, 0x8E, 0x4E, 0x11, 0xFF, 0x92, 0x57, 0x1F, 0xFF, 0x94, 0x5E, + 0x2E, 0xFF, 0x9C, 0x6C, 0x43, 0xFD, 0xB7, 0x94, 0x73, 0x80, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xAA, 0x81, 0x5D, 0x55, 0x82, 0x4A, 0x1F, 0xF9, 0x76, 0x38, 0x08, 0xFF, 0x7C, 0x3F, + 0x09, 0xFF, 0x9E, 0x7D, 0x5A, 0xFF, 0xE3, 0xE1, 0xDF, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xEA, 0xEA, + 0xEA, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xD3, 0xD0, 0xCB, 0xFF, 0xA6, 0x9C, 0x8C, 0xFF, 0xA6, 0x95, + 0x7D, 0xFF, 0x84, 0x59, 0x27, 0xFF, 0x87, 0x4B, 0x0C, 0xFF, 0x91, 0x51, 0x0F, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x90, 0x4F, 0x0F, 0xFF, 0x92, 0x55, + 0x18, 0xFF, 0x97, 0x61, 0x2E, 0xFF, 0xAA, 0x7F, 0x57, 0xDA, 0xC8, 0xA8, 0x8B, 0x1F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDB, 0xC3, + 0xA9, 0x0C, 0xA0, 0x71, 0x48, 0xB8, 0x7C, 0x3F, 0x0F, 0xFF, 0x81, 0x41, 0x0A, 0xFF, 0x88, 0x48, + 0x0C, 0xFF, 0xAF, 0x8D, 0x68, 0xFF, 0xEB, 0xEA, 0xE9, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, + 0xEC, 0xFF, 0xEF, 0xEF, 0xEE, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xDD, 0xDB, 0xD6, 0xFF, 0xA7, 0x9E, + 0x8D, 0xFF, 0xAB, 0x9E, 0x8A, 0xFF, 0x91, 0x70, 0x47, 0xFF, 0x86, 0x4F, 0x11, 0xFF, 0x94, 0x55, + 0x11, 0xFF, 0x97, 0x56, 0x12, 0xFF, 0x97, 0x56, 0x12, 0xFF, 0x96, 0x56, 0x11, 0xFF, 0x96, 0x55, + 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x96, 0x54, 0x10, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x93, 0x54, 0x16, 0xFF, 0xA2, 0x6E, 0x3D, 0xFC, 0xC1, 0x9E, 0x7B, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBC, 0x96, + 0x71, 0x2C, 0x94, 0x5D, 0x2E, 0xE9, 0x81, 0x41, 0x0B, 0xFF, 0x8B, 0x4A, 0x0D, 0xFF, 0x92, 0x51, + 0x0E, 0xFF, 0x96, 0x5B, 0x19, 0xFF, 0xCB, 0xB5, 0x9B, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xE7, 0xE5, + 0xE3, 0xFF, 0xB1, 0xA9, 0x99, 0xFF, 0xAB, 0x9F, 0x8B, 0xFF, 0xA5, 0x8F, 0x70, 0xFF, 0x89, 0x59, + 0x1D, 0xFF, 0x96, 0x59, 0x14, 0xFF, 0x9D, 0x5D, 0x16, 0xFF, 0x9D, 0x5D, 0x16, 0xFF, 0x9C, 0x5C, + 0x16, 0xFF, 0x9C, 0x5C, 0x15, 0xFF, 0x9B, 0x5A, 0x13, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x99, 0x57, + 0x10, 0xFF, 0x96, 0x54, 0x0F, 0xFF, 0x99, 0x5C, 0x1F, 0xFF, 0xB6, 0x8C, 0x62, 0xB9, 0xD0, 0xBD, + 0xA8, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB3, 0x88, + 0x5F, 0x50, 0x8F, 0x53, 0x1F, 0xFA, 0x89, 0x47, 0x0B, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x9C, 0x5B, + 0x14, 0xFF, 0xA0, 0x60, 0x18, 0xFF, 0xA4, 0x70, 0x33, 0xFF, 0xD7, 0xCC, 0xBC, 0xFF, 0xE9, 0xEA, + 0xEA, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xE9, 0xE9, 0xE8, 0xFF, 0xBD, 0xB5, 0xA7, 0xFF, 0xA8, 0x9D, 0x87, 0xFF, 0xB6, 0xA7, + 0x91, 0xFF, 0x8F, 0x68, 0x33, 0xFF, 0x97, 0x5E, 0x19, 0xFF, 0xA2, 0x63, 0x1C, 0xFF, 0xA3, 0x64, + 0x1C, 0xFF, 0xA2, 0x64, 0x1C, 0xFF, 0xA2, 0x63, 0x1C, 0xFF, 0xA1, 0x62, 0x1A, 0xFF, 0x9F, 0x5E, + 0x14, 0xFF, 0x9C, 0x5A, 0x11, 0xFF, 0x99, 0x58, 0x13, 0xFF, 0xAC, 0x79, 0x44, 0xDC, 0xCE, 0xAF, + 0x90, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB3, 0x86, + 0x5A, 0x75, 0x91, 0x52, 0x18, 0xFF, 0x92, 0x50, 0x0F, 0xFF, 0x9F, 0x60, 0x1B, 0xFF, 0xA7, 0x69, + 0x22, 0xFF, 0xA9, 0x6C, 0x23, 0xFF, 0xA7, 0x6A, 0x21, 0xFF, 0xAD, 0x82, 0x4B, 0xFF, 0xD9, 0xD3, + 0xCB, 0xFF, 0xE1, 0xE1, 0xE2, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0xE0, 0xE0, 0xE1, 0xFF, 0xE1, 0xE0, + 0xDF, 0xFF, 0xE4, 0xE4, 0xE3, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xC8, 0xC1, 0xB7, 0xFF, 0xA7, 0x9B, + 0x84, 0xFF, 0xBE, 0xB4, 0xA4, 0xFF, 0x9B, 0x7D, 0x52, 0xFF, 0x98, 0x64, 0x21, 0xFF, 0xA7, 0x6A, + 0x22, 0xFF, 0xA9, 0x6C, 0x23, 0xFF, 0xA9, 0x6C, 0x23, 0xFF, 0xA9, 0x6C, 0x23, 0xFF, 0xA9, 0x6B, + 0x22, 0xFF, 0xA5, 0x65, 0x1A, 0xFF, 0x9F, 0x5C, 0x12, 0xFF, 0xAA, 0x72, 0x35, 0xED, 0xCC, 0xA9, + 0x82, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x02, 0xB9, 0x8D, + 0x60, 0x94, 0x97, 0x56, 0x18, 0xFF, 0xA0, 0x62, 0x1F, 0xFF, 0xAB, 0x6E, 0x28, 0xFF, 0xAF, 0x72, + 0x2A, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xAC, 0x71, 0x29, 0xFF, 0xB5, 0x92, + 0x64, 0xFF, 0xD5, 0xD3, 0xCF, 0xFF, 0xD9, 0xD9, 0xDA, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xB8, 0xAE, + 0x9C, 0xFF, 0xB9, 0xAC, 0x94, 0xFF, 0xDF, 0xDE, 0xDD, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xD1, 0xCD, + 0xC5, 0xFF, 0xAC, 0xA2, 0x8C, 0xFF, 0xC2, 0xBB, 0xAE, 0xFF, 0xAC, 0x98, 0x79, 0xFF, 0x99, 0x6C, + 0x2D, 0xFF, 0xAA, 0x70, 0x28, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xB0, 0x73, + 0x2A, 0xFF, 0xAF, 0x73, 0x29, 0xFF, 0xA9, 0x6A, 0x1F, 0xFF, 0xAD, 0x74, 0x32, 0xF5, 0xCE, 0xA9, + 0x81, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x03, 0xBF, 0x94, + 0x67, 0x9D, 0xA4, 0x68, 0x2B, 0xFF, 0xAC, 0x70, 0x2E, 0xFF, 0xB2, 0x77, 0x30, 0xFF, 0xB5, 0x7B, + 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB3, 0x7D, + 0x37, 0xFF, 0xC1, 0xA9, 0x88, 0xFF, 0xD6, 0xD6, 0xD5, 0xFF, 0xD8, 0xD8, 0xD8, 0xFF, 0xCD, 0xCA, + 0xC2, 0xFF, 0xBB, 0xB0, 0x9A, 0xFF, 0xBF, 0xB4, 0x9E, 0xFF, 0xBE, 0xB5, 0xA0, 0xFF, 0xD2, 0xCE, + 0xC3, 0xFF, 0xD8, 0xD6, 0xD3, 0xFF, 0xB7, 0xAF, 0x9D, 0xFF, 0xC4, 0xBF, 0xB2, 0xFF, 0xBC, 0xAF, + 0x9A, 0xFF, 0x9F, 0x78, 0x3F, 0xFF, 0xAF, 0x78, 0x30, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, + 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB4, 0x79, 0x30, 0xFF, 0xB8, 0x81, 0x41, 0xF7, 0xD2, 0xAF, + 0x86, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x01, 0xC9, 0x9F, + 0x73, 0x8E, 0xB1, 0x78, 0x3C, 0xFF, 0xB4, 0x79, 0x36, 0xFF, 0xB9, 0x80, 0x38, 0xFF, 0xBC, 0x83, + 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBE, 0x87, 0x3F, 0xFF, 0xC4, 0x92, + 0x51, 0xFF, 0xC2, 0x97, 0x5D, 0xFF, 0xCF, 0xBE, 0xA8, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDF, 0xDF, + 0xE0, 0xFF, 0xD5, 0xD2, 0xCB, 0xFF, 0xC5, 0xBD, 0xAA, 0xFF, 0xCC, 0xC5, 0xB8, 0xFF, 0xD1, 0xCE, + 0xC8, 0xFF, 0xDE, 0xDE, 0xDF, 0xFF, 0xDD, 0xDC, 0xDA, 0xFF, 0xC3, 0xBE, 0xAF, 0xFF, 0xC8, 0xC2, + 0xB6, 0xFF, 0xCA, 0xBF, 0xAE, 0xFF, 0xAE, 0x82, 0x44, 0xFF, 0xBB, 0x82, 0x38, 0xFF, 0xBC, 0x83, + 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBB, 0x82, 0x38, 0xFF, 0xC2, 0x90, 0x53, 0xF3, 0xD8, 0xB7, + 0x8F, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xA4, + 0x76, 0x6B, 0xBA, 0x84, 0x49, 0xFF, 0xBB, 0x82, 0x3E, 0xFF, 0xC0, 0x88, 0x40, 0xFF, 0xC2, 0x8B, + 0x41, 0xFF, 0xC2, 0x8B, 0x41, 0xFF, 0xC3, 0x8D, 0x45, 0xFF, 0xCC, 0x9C, 0x5D, 0xFF, 0xCF, 0xA1, + 0x65, 0xFF, 0xCE, 0xA0, 0x64, 0xFF, 0xCB, 0xA4, 0x70, 0xFF, 0xDA, 0xD0, 0xC0, 0xFF, 0xE6, 0xE7, + 0xE8, 0xFF, 0xDA, 0xD6, 0xCE, 0xFF, 0xCE, 0xC7, 0xB6, 0xFF, 0xC9, 0xC0, 0xAF, 0xFF, 0xD1, 0xCA, + 0xBD, 0xFF, 0xDE, 0xDD, 0xDD, 0xFF, 0xE0, 0xE0, 0xE1, 0xFF, 0xE3, 0xE2, 0xE2, 0xFF, 0xD2, 0xCF, + 0xC4, 0xFF, 0xCD, 0xC4, 0xB2, 0xFF, 0xB9, 0x90, 0x54, 0xFF, 0xC1, 0x8A, 0x40, 0xFF, 0xC2, 0x8B, + 0x41, 0xFF, 0xC2, 0x8B, 0x41, 0xFF, 0xC1, 0x8A, 0x41, 0xFF, 0xCB, 0x9C, 0x60, 0xEA, 0xDD, 0xBF, + 0x99, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0xAE, + 0x80, 0x47, 0xC5, 0x93, 0x58, 0xF7, 0xC2, 0x8A, 0x47, 0xFF, 0xC8, 0x91, 0x49, 0xFF, 0xCA, 0x94, + 0x4A, 0xFF, 0xCA, 0x94, 0x4A, 0xFF, 0xCF, 0x9D, 0x5B, 0xFF, 0xD5, 0xAB, 0x72, 0xFF, 0xD5, 0xAB, + 0x72, 0xFF, 0xD5, 0xAB, 0x72, 0xFF, 0xD4, 0xAA, 0x71, 0xFF, 0xD3, 0xB2, 0x83, 0xFF, 0xE5, 0xDE, + 0xD5, 0xFF, 0xDE, 0xDC, 0xD7, 0xFF, 0xCC, 0xC5, 0xB6, 0xFF, 0xD5, 0xD1, 0xC5, 0xFF, 0xBE, 0xB5, + 0x9E, 0xFF, 0xE1, 0xE0, 0xDF, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE9, 0xE9, + 0xE9, 0xFF, 0xD1, 0xC5, 0xB0, 0xFF, 0xBA, 0x92, 0x54, 0xFF, 0xC5, 0x91, 0x48, 0xFF, 0xCA, 0x94, + 0x4A, 0xFF, 0xCA, 0x94, 0x4A, 0xFF, 0xCA, 0x95, 0x4D, 0xFF, 0xD4, 0xA9, 0x72, 0xD5, 0xDE, 0xC4, + 0xA2, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xBD, + 0x92, 0x23, 0xD2, 0xA4, 0x6C, 0xE2, 0xCB, 0x94, 0x51, 0xFF, 0xCE, 0x99, 0x51, 0xFF, 0xD1, 0x9C, + 0x52, 0xFF, 0xD2, 0x9E, 0x55, 0xFF, 0xDA, 0xB0, 0x75, 0xFF, 0xDC, 0xB6, 0x7F, 0xFF, 0xDC, 0xB6, + 0x7F, 0xFF, 0xDC, 0xB6, 0x7F, 0xFF, 0xDC, 0xB6, 0x7F, 0xFF, 0xDB, 0xB5, 0x7D, 0xFF, 0xDB, 0xBF, + 0x96, 0xFF, 0xEA, 0xE6, 0xDF, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xE6, 0xE6, + 0xE5, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, 0xE9, 0xFF, 0xEB, 0xEB, + 0xE9, 0xFF, 0xE2, 0xE0, 0xD8, 0xFF, 0xCB, 0xBB, 0x9D, 0xFF, 0xC0, 0x9C, 0x61, 0xFF, 0xCE, 0x9B, + 0x51, 0xFF, 0xD1, 0x9C, 0x52, 0xFF, 0xD3, 0xA1, 0x5C, 0xFF, 0xDD, 0xB8, 0x87, 0xAC, 0xD7, 0xCD, + 0xBF, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xDF, + 0xC4, 0x06, 0xDD, 0xB4, 0x81, 0xA0, 0xD4, 0xA0, 0x5F, 0xFF, 0xD5, 0xA1, 0x59, 0xFF, 0xD7, 0xA4, + 0x5A, 0xFF, 0xDA, 0xA9, 0x61, 0xFF, 0xE2, 0xBD, 0x86, 0xFF, 0xE3, 0xBF, 0x8B, 0xFF, 0xE3, 0xBF, + 0x8B, 0xFF, 0xE3, 0xBF, 0x8B, 0xFF, 0xE3, 0xBF, 0x8B, 0xFF, 0xE3, 0xBF, 0x8B, 0xFF, 0xE2, 0xBE, + 0x8A, 0xFF, 0xE1, 0xCA, 0xA5, 0xFF, 0xEF, 0xEC, 0xE6, 0xFF, 0xF2, 0xF3, 0xF3, 0xFF, 0xF0, 0xF0, + 0xF0, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEC, 0xEC, 0xE9, 0xFF, 0xEF, 0xEF, + 0xEE, 0xFF, 0xED, 0xED, 0xEA, 0xFF, 0xEB, 0xEA, 0xE6, 0xFF, 0xD7, 0xC2, 0x9F, 0xFF, 0xD3, 0xA2, + 0x5A, 0xFF, 0xD8, 0xA5, 0x5B, 0xFF, 0xDC, 0xB0, 0x70, 0xF7, 0xE2, 0xC3, 0x98, 0x56, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xE3, 0xBF, 0x90, 0x41, 0xDE, 0xB1, 0x75, 0xF2, 0xDB, 0xA8, 0x62, 0xFF, 0xDD, 0xAC, + 0x62, 0xFF, 0xE0, 0xB1, 0x6B, 0xFF, 0xE8, 0xC7, 0x92, 0xFF, 0xE9, 0xC9, 0x97, 0xFF, 0xE9, 0xC9, + 0x96, 0xFF, 0xE9, 0xC9, 0x96, 0xFF, 0xE9, 0xC9, 0x96, 0xFF, 0xE9, 0xC9, 0x96, 0xFF, 0xE9, 0xC9, + 0x96, 0xFF, 0xE7, 0xC8, 0x96, 0xFF, 0xE7, 0xD2, 0xAF, 0xFF, 0xF2, 0xEF, 0xE9, 0xFF, 0xF5, 0xF6, + 0xF7, 0xFF, 0xF3, 0xF3, 0xF2, 0xFF, 0xF3, 0xF3, 0xF1, 0xFF, 0xF4, 0xF4, 0xF4, 0xFF, 0xF4, 0xF4, + 0xF3, 0xFF, 0xEA, 0xEA, 0xE4, 0xFF, 0xEC, 0xE5, 0xD9, 0xFF, 0xD7, 0xB4, 0x7B, 0xFF, 0xDC, 0xAC, + 0x62, 0xFF, 0xE0, 0xB0, 0x69, 0xFF, 0xE5, 0xC0, 0x89, 0xCA, 0xE7, 0xCF, 0xA9, 0x14, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xE6, 0xCD, 0xA7, 0x09, 0xE6, 0xC0, 0x8B, 0xA1, 0xE2, 0xB3, 0x72, 0xFF, 0xE2, 0xB2, + 0x6A, 0xFF, 0xE5, 0xB8, 0x71, 0xFF, 0xED, 0xCD, 0x9A, 0xFF, 0xEE, 0xD1, 0xA2, 0xFF, 0xEE, 0xD1, + 0xA1, 0xFF, 0xEE, 0xD1, 0xA1, 0xFF, 0xEE, 0xD1, 0xA1, 0xFF, 0xEE, 0xD1, 0xA1, 0xFF, 0xEE, 0xD1, + 0xA1, 0xFF, 0xEE, 0xD1, 0xA1, 0xFF, 0xED, 0xD0, 0xA1, 0xFF, 0xEC, 0xD7, 0xB3, 0xFF, 0xF2, 0xEA, + 0xDC, 0xFF, 0xEA, 0xDB, 0xC0, 0xFF, 0xED, 0xDE, 0xC4, 0xFF, 0xF6, 0xF4, 0xEF, 0xFF, 0xE9, 0xE8, + 0xE1, 0xFF, 0xF4, 0xF1, 0xEB, 0xFF, 0xE4, 0xCC, 0xA0, 0xFF, 0xE1, 0xB3, 0x6A, 0xFF, 0xE4, 0xB5, + 0x6C, 0xFF, 0xE7, 0xBE, 0x80, 0xF6, 0xEB, 0xCD, 0x9F, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEB, 0xCC, 0x9C, 0x2A, 0xEA, 0xC3, 0x8A, 0xD9, 0xE8, 0xBA, + 0x76, 0xFF, 0xE9, 0xBB, 0x74, 0xFF, 0xEF, 0xCE, 0x98, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF2, 0xD7, + 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, + 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAA, 0xFF, 0xF0, 0xD7, + 0xAD, 0xFF, 0xF0, 0xD6, 0xAA, 0xFF, 0xF0, 0xD6, 0xAB, 0xFF, 0xF1, 0xE1, 0xC3, 0xFF, 0xF4, 0xEF, + 0xE3, 0xFF, 0xED, 0xDC, 0xBD, 0xFF, 0xE9, 0xC3, 0x85, 0xFF, 0xE9, 0xBB, 0x72, 0xFF, 0xEB, 0xC1, + 0x7F, 0xFF, 0xEE, 0xCE, 0x9A, 0xA5, 0xED, 0xD8, 0xB7, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xCF, 0x9C, 0x4B, 0xEE, 0xC8, + 0x8D, 0xE8, 0xED, 0xC0, 0x7C, 0xFF, 0xEF, 0xC9, 0x88, 0xFF, 0xF5, 0xDC, 0xB1, 0xFF, 0xF5, 0xDD, + 0xB4, 0xFF, 0xF5, 0xDD, 0xB4, 0xFF, 0xF5, 0xDD, 0xB4, 0xFF, 0xF5, 0xDD, 0xB4, 0xFF, 0xF5, 0xDD, + 0xB4, 0xFF, 0xF5, 0xDD, 0xB4, 0xFF, 0xF5, 0xDD, 0xB4, 0xFF, 0xF5, 0xDD, 0xB4, 0xFF, 0xF5, 0xDD, + 0xB4, 0xFF, 0xF5, 0xDD, 0xB4, 0xFF, 0xF5, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xE0, + 0xBB, 0xFF, 0xF2, 0xD7, 0xA8, 0xFF, 0xEE, 0xC4, 0x7E, 0xFF, 0xEE, 0xC7, 0x83, 0xFF, 0xF1, 0xD1, + 0x99, 0xC2, 0xF1, 0xD8, 0xAE, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFA, 0xFF, 0xFF, 0x01, 0xF3, 0xD3, + 0xA0, 0x56, 0xF2, 0xCE, 0x93, 0xE7, 0xF1, 0xC9, 0x86, 0xFF, 0xF4, 0xD5, 0x9F, 0xFF, 0xF8, 0xE2, + 0xBB, 0xFF, 0xF8, 0xE3, 0xBC, 0xFF, 0xF8, 0xE3, 0xBC, 0xFF, 0xF8, 0xE3, 0xBC, 0xFF, 0xF8, 0xE3, + 0xBC, 0xFF, 0xF8, 0xE3, 0xBC, 0xFF, 0xF8, 0xE3, 0xBC, 0xFF, 0xF8, 0xE3, 0xBC, 0xFF, 0xF8, 0xE3, + 0xBC, 0xFF, 0xF8, 0xE3, 0xBC, 0xFF, 0xF8, 0xE3, 0xBC, 0xFF, 0xF8, 0xE3, 0xBC, 0xFF, 0xF7, 0xE0, + 0xB6, 0xFF, 0xF3, 0xD0, 0x92, 0xFF, 0xF2, 0xCC, 0x8A, 0xFF, 0xF4, 0xD4, 0x9E, 0xC4, 0xF4, 0xDA, + 0xAE, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0x01, 0xF5, 0xD7, 0xA5, 0x44, 0xF5, 0xD4, 0x9B, 0xCE, 0xF5, 0xD1, 0x93, 0xFF, 0xF7, 0xDB, + 0xA8, 0xFF, 0xFA, 0xE5, 0xC0, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, 0xC2, 0xFF, 0xFA, 0xE6, + 0xC2, 0xFF, 0xFA, 0xE6, 0xC2, 0xFF, 0xFA, 0xE6, 0xC2, 0xFF, 0xFA, 0xE6, 0xC2, 0xFF, 0xFA, 0xE6, + 0xC2, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xF9, 0xE3, 0xBB, 0xFF, 0xF6, 0xD7, + 0x9E, 0xFF, 0xF6, 0xD3, 0x96, 0xF8, 0xF7, 0xD8, 0xA4, 0xA6, 0xF7, 0xDD, 0xB1, 0x21, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0xDA, 0xAC, 0x1E, 0xF7, 0xD9, 0xA4, 0x84, 0xF8, 0xD8, + 0x9F, 0xE5, 0xF9, 0xDC, 0xA8, 0xFF, 0xFB, 0xE4, 0xBD, 0xFF, 0xFC, 0xE8, 0xC8, 0xFF, 0xFC, 0xE9, + 0xCA, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xE9, 0xCA, 0xFF, 0xFC, 0xE9, + 0xC9, 0xFF, 0xFC, 0xE8, 0xC5, 0xFF, 0xFB, 0xE2, 0xB7, 0xFF, 0xF9, 0xDB, 0xA4, 0xFA, 0xF8, 0xDA, + 0xA3, 0xCE, 0xF8, 0xDC, 0xAB, 0x5B, 0xF9, 0xE2, 0xB9, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xE6, 0xCF, 0x03, 0xF8, 0xDD, + 0xAC, 0x2A, 0xF9, 0xDC, 0xA9, 0x71, 0xFA, 0xDD, 0xAA, 0xC4, 0xFB, 0xE1, 0xB2, 0xE5, 0xFB, 0xE4, + 0xB8, 0xF2, 0xFB, 0xE6, 0xBE, 0xF8, 0xFB, 0xE7, 0xC0, 0xF9, 0xFB, 0xE5, 0xBD, 0xF7, 0xFB, 0xE3, + 0xB6, 0xEF, 0xFB, 0xE1, 0xB0, 0xDD, 0xFA, 0xDE, 0xAB, 0xAD, 0xF9, 0xDE, 0xAC, 0x56, 0xF8, 0xE0, + 0xB4, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFB, 0xE2, 0xB6, 0x12, 0xFB, 0xDF, 0xAD, 0x2D, 0xFB, 0xDF, + 0xAB, 0x46, 0xFB, 0xE0, 0xAE, 0x58, 0xFB, 0xE1, 0xB0, 0x5C, 0xFB, 0xE0, 0xAE, 0x53, 0xFB, 0xDF, + 0xAC, 0x3E, 0xFB, 0xE1, 0xB1, 0x24, 0xFC, 0xE7, 0xC1, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x03, 0xE0, 0x00, + 0x00, 0x01, 0xE0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x01, 0xE0, 0x00, + 0x00, 0x03, 0xF8, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x07, 0xE0, 0x00, + 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x01, 0xC0, 0x00, + 0x00, 0x01, 0xC0, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, + 0x00, 0x01, 0xC0, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x01, 0xC0, 0x00, + 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x07, 0xF8, 0x00, + 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x7F, 0xFF, 0x80, + 0x01, 0xFF, 0xFF, 0xF0, 0x07, 0xFF +}; + +void *get_window_icon_raw_data(int *len) +{ + *len = (int)sizeof(window_icon_hexData); + return window_icon_hexData; +} + diff --git a/src/gui/Include/Hiperiso2Disk.h b/src/gui/Include/Hiperiso2Disk.h new file mode 100644 index 0000000..1fc3c0f --- /dev/null +++ b/src/gui/Include/Hiperiso2Disk.h @@ -0,0 +1,26 @@ +/****************************************************************************** + * Hiperiso2Disk.h + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#ifndef __HIPERISO2DISK_H__ +#define __HIPERISO2DISK_H__ + + + +#endif /* __HIPERISO2DISK_H__ */ + diff --git a/src/gui/Lib/exfat/buidexfat.sh b/src/gui/Lib/exfat/buidexfat.sh new file mode 100644 index 0000000..00a83c6 --- /dev/null +++ b/src/gui/Lib/exfat/buidexfat.sh @@ -0,0 +1,30 @@ +#!/bin/sh + +CUR="$PWD" + +rm -rf src +mkdir -p src/libexfat +mkdir -p src/mkfs + +rm -rf exfat-1.3.0 +unzip exfat-1.3.0.zip + +cd exfat-1.3.0 +autoreconf --install +./configure --prefix="$CUR" CFLAGS='-O2 -D_FILE_OFFSET_BITS=64' +make + +cp -a libexfat/*.c ../src/libexfat/ +cp -a libexfat/*.h ../src/libexfat/ +cp -a mkfs/*.c ../src/mkfs/ +cp -a mkfs/*.h ../src/mkfs/ +rm -f ../src/libexfat/log.c + +cd .. +rm -rf exfat-1.3.0 + +mv src/mkfs/main.c src/mkfs/mkexfat_main.c +sed 's//"exfat.h"/g' -i src/mkfs/mkexfat_main.c +sed 's//"exfat.h"/g' -i src/mkfs/mkexfat.h +sed 's/int main/int mkexfat_main/g' -i src/mkfs/mkexfat_main.c + diff --git a/src/gui/Lib/exfat/exfat-1.3.0.zip b/src/gui/Lib/exfat/exfat-1.3.0.zip new file mode 100644 index 0000000..aa1d5f3 Binary files /dev/null and b/src/gui/Lib/exfat/exfat-1.3.0.zip differ diff --git a/src/gui/Lib/exfat/src/libexfat/byteorder.h b/src/gui/Lib/exfat/src/libexfat/byteorder.h new file mode 100644 index 0000000..ba54410 --- /dev/null +++ b/src/gui/Lib/exfat/src/libexfat/byteorder.h @@ -0,0 +1,68 @@ +/* + byteorder.h (12.01.10) + Endianness stuff. exFAT uses little-endian byte order. + + Free exFAT implementation. + Copyright (C) 2010-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef BYTEORDER_H_INCLUDED +#define BYTEORDER_H_INCLUDED + +#include "platform.h" +#include +#include + +typedef struct { uint16_t __u16; } le16_t; +typedef struct { uint32_t __u32; } le32_t; +typedef struct { uint64_t __u64; } le64_t; + +#if EXFAT_BYTE_ORDER == EXFAT_LITTLE_ENDIAN + +static inline uint16_t le16_to_cpu(le16_t v) { return v.__u16; } +static inline uint32_t le32_to_cpu(le32_t v) { return v.__u32; } +static inline uint64_t le64_to_cpu(le64_t v) { return v.__u64; } + +static inline le16_t cpu_to_le16(uint16_t v) { le16_t t = {v}; return t; } +static inline le32_t cpu_to_le32(uint32_t v) { le32_t t = {v}; return t; } +static inline le64_t cpu_to_le64(uint64_t v) { le64_t t = {v}; return t; } + +typedef size_t bitmap_t; + +#elif EXFAT_BYTE_ORDER == EXFAT_BIG_ENDIAN + +static inline uint16_t le16_to_cpu(le16_t v) + { return exfat_bswap16(v.__u16); } +static inline uint32_t le32_to_cpu(le32_t v) + { return exfat_bswap32(v.__u32); } +static inline uint64_t le64_to_cpu(le64_t v) + { return exfat_bswap64(v.__u64); } + +static inline le16_t cpu_to_le16(uint16_t v) + { le16_t t = {exfat_bswap16(v)}; return t; } +static inline le32_t cpu_to_le32(uint32_t v) + { le32_t t = {exfat_bswap32(v)}; return t; } +static inline le64_t cpu_to_le64(uint64_t v) + { le64_t t = {exfat_bswap64(v)}; return t; } + +typedef unsigned char bitmap_t; + +#else +#error Wow! You have a PDP machine?! +#endif + +#endif /* ifndef BYTEORDER_H_INCLUDED */ diff --git a/src/gui/Lib/exfat/src/libexfat/cluster.c b/src/gui/Lib/exfat/src/libexfat/cluster.c new file mode 100644 index 0000000..15cd9aa --- /dev/null +++ b/src/gui/Lib/exfat/src/libexfat/cluster.c @@ -0,0 +1,491 @@ +/* + cluster.c (03.09.09) + exFAT file system implementation library. + + Free exFAT implementation. + Copyright (C) 2010-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "exfat.h" +#include +#include +#include + +/* + * Sector to absolute offset. + */ +static off_t s2o(const struct exfat* ef, off_t sector) +{ + return sector << ef->sb->sector_bits; +} + +/* + * Cluster to sector. + */ +static off_t c2s(const struct exfat* ef, cluster_t cluster) +{ + if (cluster < EXFAT_FIRST_DATA_CLUSTER) + exfat_bug("invalid cluster number %u", cluster); + return le32_to_cpu(ef->sb->cluster_sector_start) + + ((off_t) (cluster - EXFAT_FIRST_DATA_CLUSTER) << ef->sb->spc_bits); +} + +/* + * Cluster to absolute offset. + */ +off_t exfat_c2o(const struct exfat* ef, cluster_t cluster) +{ + return s2o(ef, c2s(ef, cluster)); +} + +/* + * Sector to cluster. + */ +static cluster_t s2c(const struct exfat* ef, off_t sector) +{ + return ((sector - le32_to_cpu(ef->sb->cluster_sector_start)) >> + ef->sb->spc_bits) + EXFAT_FIRST_DATA_CLUSTER; +} + +/* + * Size in bytes to size in clusters (rounded upwards). + */ +static uint32_t bytes2clusters(const struct exfat* ef, uint64_t bytes) +{ + uint64_t cluster_size = CLUSTER_SIZE(*ef->sb); + return DIV_ROUND_UP(bytes, cluster_size); +} + +cluster_t exfat_next_cluster(const struct exfat* ef, + const struct exfat_node* node, cluster_t cluster) +{ + le32_t next; + off_t fat_offset; + + if (cluster < EXFAT_FIRST_DATA_CLUSTER) + exfat_bug("bad cluster 0x%x", cluster); + + if (node->is_contiguous) + return cluster + 1; + fat_offset = s2o(ef, le32_to_cpu(ef->sb->fat_sector_start)) + + cluster * sizeof(cluster_t); + if (exfat_pread(ef->dev, &next, sizeof(next), fat_offset) < 0) + return EXFAT_CLUSTER_BAD; /* the caller should handle this and print + appropriate error message */ + return le32_to_cpu(next); +} + +cluster_t exfat_advance_cluster(const struct exfat* ef, + struct exfat_node* node, uint32_t count) +{ + uint32_t i; + + if (node->fptr_index > count) + { + node->fptr_index = 0; + node->fptr_cluster = node->start_cluster; + } + + for (i = node->fptr_index; i < count; i++) + { + node->fptr_cluster = exfat_next_cluster(ef, node, node->fptr_cluster); + if (CLUSTER_INVALID(*ef->sb, node->fptr_cluster)) + break; /* the caller should handle this and print appropriate + error message */ + } + node->fptr_index = count; + return node->fptr_cluster; +} + +static cluster_t find_bit_and_set(bitmap_t* bitmap, size_t start, size_t end) +{ + const size_t start_index = start / sizeof(bitmap_t) / 8; + const size_t end_index = DIV_ROUND_UP(end, sizeof(bitmap_t) * 8); + size_t i; + size_t start_bitindex; + size_t end_bitindex; + size_t c; + + for (i = start_index; i < end_index; i++) + { + if (bitmap[i] == ~((bitmap_t) 0)) + continue; + start_bitindex = MAX(i * sizeof(bitmap_t) * 8, start); + end_bitindex = MIN((i + 1) * sizeof(bitmap_t) * 8, end); + for (c = start_bitindex; c < end_bitindex; c++) + if (BMAP_GET(bitmap, c) == 0) + { + BMAP_SET(bitmap, c); + return c + EXFAT_FIRST_DATA_CLUSTER; + } + } + return EXFAT_CLUSTER_END; +} + +static int flush_nodes(struct exfat* ef, struct exfat_node* node) +{ + struct exfat_node* p; + + for (p = node->child; p != NULL; p = p->next) + { + int rc = flush_nodes(ef, p); + if (rc != 0) + return rc; + } + return exfat_flush_node(ef, node); +} + +int exfat_flush_nodes(struct exfat* ef) +{ + return flush_nodes(ef, ef->root); +} + +int exfat_flush(struct exfat* ef) +{ + if (ef->cmap.dirty) + { + if (exfat_pwrite(ef->dev, ef->cmap.chunk, + BMAP_SIZE(ef->cmap.chunk_size), + exfat_c2o(ef, ef->cmap.start_cluster)) < 0) + { + exfat_error("failed to write clusters bitmap"); + return -EIO; + } + ef->cmap.dirty = false; + } + + return 0; +} + +static bool set_next_cluster(const struct exfat* ef, bool contiguous, + cluster_t current, cluster_t next) +{ + off_t fat_offset; + le32_t next_le32; + + if (contiguous) + return true; + fat_offset = s2o(ef, le32_to_cpu(ef->sb->fat_sector_start)) + + current * sizeof(cluster_t); + next_le32 = cpu_to_le32(next); + if (exfat_pwrite(ef->dev, &next_le32, sizeof(next_le32), fat_offset) < 0) + { + exfat_error("failed to write the next cluster %#x after %#x", next, + current); + return false; + } + return true; +} + +static cluster_t allocate_cluster(struct exfat* ef, cluster_t hint) +{ + cluster_t cluster; + + hint -= EXFAT_FIRST_DATA_CLUSTER; + if (hint >= ef->cmap.chunk_size) + hint = 0; + + cluster = find_bit_and_set(ef->cmap.chunk, hint, ef->cmap.chunk_size); + if (cluster == EXFAT_CLUSTER_END) + cluster = find_bit_and_set(ef->cmap.chunk, 0, hint); + if (cluster == EXFAT_CLUSTER_END) + { + exfat_error("no free space left"); + return EXFAT_CLUSTER_END; + } + + ef->cmap.dirty = true; + return cluster; +} + +static void free_cluster(struct exfat* ef, cluster_t cluster) +{ + if (cluster - EXFAT_FIRST_DATA_CLUSTER >= ef->cmap.size) + exfat_bug("caller must check cluster validity (%#x, %#x)", cluster, + ef->cmap.size); + + BMAP_CLR(ef->cmap.chunk, cluster - EXFAT_FIRST_DATA_CLUSTER); + ef->cmap.dirty = true; +} + +static bool make_noncontiguous(const struct exfat* ef, cluster_t first, + cluster_t last) +{ + cluster_t c; + + for (c = first; c < last; c++) + if (!set_next_cluster(ef, false, c, c + 1)) + return false; + return true; +} + +static int shrink_file(struct exfat* ef, struct exfat_node* node, + uint32_t current, uint32_t difference); + +static int grow_file(struct exfat* ef, struct exfat_node* node, + uint32_t current, uint32_t difference) +{ + cluster_t previous; + cluster_t next; + uint32_t allocated = 0; + + if (difference == 0) + exfat_bug("zero clusters count passed"); + + if (node->start_cluster != EXFAT_CLUSTER_FREE) + { + /* get the last cluster of the file */ + previous = exfat_advance_cluster(ef, node, current - 1); + if (CLUSTER_INVALID(*ef->sb, previous)) + { + exfat_error("invalid cluster 0x%x while growing", previous); + return -EIO; + } + } + else + { + if (node->fptr_index != 0) + exfat_bug("non-zero pointer index (%u)", node->fptr_index); + /* file does not have clusters (i.e. is empty), allocate + the first one for it */ + previous = allocate_cluster(ef, 0); + if (CLUSTER_INVALID(*ef->sb, previous)) + return -ENOSPC; + node->fptr_cluster = node->start_cluster = previous; + allocated = 1; + /* file consists of only one cluster, so it's contiguous */ + node->is_contiguous = true; + } + + while (allocated < difference) + { + next = allocate_cluster(ef, previous + 1); + if (CLUSTER_INVALID(*ef->sb, next)) + { + if (allocated != 0) + shrink_file(ef, node, current + allocated, allocated); + return -ENOSPC; + } + if (next != previous - 1 && node->is_contiguous) + { + /* it's a pity, but we are not able to keep the file contiguous + anymore */ + if (!make_noncontiguous(ef, node->start_cluster, previous)) + return -EIO; + node->is_contiguous = false; + node->is_dirty = true; + } + if (!set_next_cluster(ef, node->is_contiguous, previous, next)) + return -EIO; + previous = next; + allocated++; + } + + if (!set_next_cluster(ef, node->is_contiguous, previous, + EXFAT_CLUSTER_END)) + return -EIO; + return 0; +} + +static int shrink_file(struct exfat* ef, struct exfat_node* node, + uint32_t current, uint32_t difference) +{ + cluster_t previous; + cluster_t next; + + if (difference == 0) + exfat_bug("zero difference passed"); + if (node->start_cluster == EXFAT_CLUSTER_FREE) + exfat_bug("unable to shrink empty file (%u clusters)", current); + if (current < difference) + exfat_bug("file underflow (%u < %u)", current, difference); + + /* crop the file */ + if (current > difference) + { + cluster_t last = exfat_advance_cluster(ef, node, + current - difference - 1); + if (CLUSTER_INVALID(*ef->sb, last)) + { + exfat_error("invalid cluster 0x%x while shrinking", last); + return -EIO; + } + previous = exfat_next_cluster(ef, node, last); + if (!set_next_cluster(ef, node->is_contiguous, last, + EXFAT_CLUSTER_END)) + return -EIO; + } + else + { + previous = node->start_cluster; + node->start_cluster = EXFAT_CLUSTER_FREE; + node->is_dirty = true; + } + node->fptr_index = 0; + node->fptr_cluster = node->start_cluster; + + /* free remaining clusters */ + while (difference--) + { + if (CLUSTER_INVALID(*ef->sb, previous)) + { + exfat_error("invalid cluster 0x%x while freeing after shrink", + previous); + return -EIO; + } + + next = exfat_next_cluster(ef, node, previous); + if (!set_next_cluster(ef, node->is_contiguous, previous, + EXFAT_CLUSTER_FREE)) + return -EIO; + free_cluster(ef, previous); + previous = next; + } + return 0; +} + +static bool erase_raw(struct exfat* ef, size_t size, off_t offset) +{ + if (exfat_pwrite(ef->dev, ef->zero_cluster, size, offset) < 0) + { + exfat_error("failed to erase %zu bytes at %"PRId64, size, offset); + return false; + } + return true; +} + +static int erase_range(struct exfat* ef, struct exfat_node* node, + uint64_t begin, uint64_t end) +{ + uint64_t cluster_boundary; + cluster_t cluster; + + if (begin >= end) + return 0; + + cluster_boundary = (begin | (CLUSTER_SIZE(*ef->sb) - 1)) + 1; + cluster = exfat_advance_cluster(ef, node, + begin / CLUSTER_SIZE(*ef->sb)); + if (CLUSTER_INVALID(*ef->sb, cluster)) + { + exfat_error("invalid cluster 0x%x while erasing", cluster); + return -EIO; + } + /* erase from the beginning to the closest cluster boundary */ + if (!erase_raw(ef, MIN(cluster_boundary, end) - begin, + exfat_c2o(ef, cluster) + begin % CLUSTER_SIZE(*ef->sb))) + return -EIO; + /* erase whole clusters */ + while (cluster_boundary < end) + { + cluster = exfat_next_cluster(ef, node, cluster); + /* the cluster cannot be invalid because we have just allocated it */ + if (CLUSTER_INVALID(*ef->sb, cluster)) + exfat_bug("invalid cluster 0x%x after allocation", cluster); + if (!erase_raw(ef, CLUSTER_SIZE(*ef->sb), exfat_c2o(ef, cluster))) + return -EIO; + cluster_boundary += CLUSTER_SIZE(*ef->sb); + } + return 0; +} + +int exfat_truncate(struct exfat* ef, struct exfat_node* node, uint64_t size, + bool erase) +{ + uint32_t c1 = bytes2clusters(ef, node->size); + uint32_t c2 = bytes2clusters(ef, size); + int rc = 0; + + if (node->references == 0 && node->parent) + exfat_bug("no references, node changes can be lost"); + + if (node->size == size) + return 0; + + if (c1 < c2) + rc = grow_file(ef, node, c1, c2 - c1); + else if (c1 > c2) + rc = shrink_file(ef, node, c1, c1 - c2); + + if (rc != 0) + return rc; + + if (erase) + { + rc = erase_range(ef, node, node->size, size); + if (rc != 0) + return rc; + } + + exfat_update_mtime(node); + node->size = size; + node->is_dirty = true; + return 0; +} + +uint32_t exfat_count_free_clusters(const struct exfat* ef) +{ + uint32_t free_clusters = 0; + uint32_t i; + + for (i = 0; i < ef->cmap.size; i++) + if (BMAP_GET(ef->cmap.chunk, i) == 0) + free_clusters++; + return free_clusters; +} + +static int find_used_clusters(const struct exfat* ef, + cluster_t* a, cluster_t* b) +{ + const cluster_t end = le32_to_cpu(ef->sb->cluster_count); + + /* find first used cluster */ + for (*a = *b + 1; *a < end; (*a)++) + if (BMAP_GET(ef->cmap.chunk, *a - EXFAT_FIRST_DATA_CLUSTER)) + break; + if (*a >= end) + return 1; + + /* find last contiguous used cluster */ + for (*b = *a; *b < end; (*b)++) + if (BMAP_GET(ef->cmap.chunk, *b - EXFAT_FIRST_DATA_CLUSTER) == 0) + { + (*b)--; + break; + } + + return 0; +} + +int exfat_find_used_sectors(const struct exfat* ef, off_t* a, off_t* b) +{ + cluster_t ca, cb; + + if (*a == 0 && *b == 0) + ca = cb = EXFAT_FIRST_DATA_CLUSTER - 1; + else + { + ca = s2c(ef, *a); + cb = s2c(ef, *b); + } + if (find_used_clusters(ef, &ca, &cb) != 0) + return 1; + if (*a != 0 || *b != 0) + *a = c2s(ef, ca); + *b = c2s(ef, cb) + (CLUSTER_SIZE(*ef->sb) - 1) / SECTOR_SIZE(*ef->sb); + return 0; +} diff --git a/src/gui/Lib/exfat/src/libexfat/compiler.h b/src/gui/Lib/exfat/src/libexfat/compiler.h new file mode 100644 index 0000000..7eb686c --- /dev/null +++ b/src/gui/Lib/exfat/src/libexfat/compiler.h @@ -0,0 +1,66 @@ +/* + compiler.h (09.06.13) + Compiler-specific definitions. Note that unknown compiler is not a + showstopper. + + Free exFAT implementation. + Copyright (C) 2010-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef COMPILER_H_INCLUDED +#define COMPILER_H_INCLUDED + +#if __STDC_VERSION__ < 199901L +#error C99-compliant compiler is required +#endif + +#if defined(__clang__) + +#define PRINTF __attribute__((format(printf, 1, 2))) +#define NORETURN __attribute__((noreturn)) +#define PACKED __attribute__((packed)) +#if __has_extension(c_static_assert) +#define USE_C11_STATIC_ASSERT +#endif + +#elif defined(__GNUC__) + +#define PRINTF __attribute__((format(printf, 1, 2))) +#define NORETURN __attribute__((noreturn)) +#define PACKED __attribute__((packed)) +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) +#define USE_C11_STATIC_ASSERT +#endif + +#else + +#define PRINTF +#define NORETURN +#define PACKED + +#endif + +#ifdef USE_C11_STATIC_ASSERT +#define STATIC_ASSERT(cond) _Static_assert(cond, #cond) +#else +#define CONCAT2(a, b) a ## b +#define CONCAT1(a, b) CONCAT2(a, b) +#define STATIC_ASSERT(cond) \ + extern void CONCAT1(static_assert, __LINE__)(int x[(cond) ? 1 : -1]) +#endif + +#endif /* ifndef COMPILER_H_INCLUDED */ diff --git a/src/gui/Lib/exfat/src/libexfat/config.h b/src/gui/Lib/exfat/src/libexfat/config.h new file mode 100644 index 0000000..73059a7 --- /dev/null +++ b/src/gui/Lib/exfat/src/libexfat/config.h @@ -0,0 +1,40 @@ +/* libexfat/config.h. Generated from config.h.in by configure. */ +/* libexfat/config.h.in. Generated from configure.ac by autoheader. */ + +/* Name of package */ +#define PACKAGE "exfat" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "relan@users.noreply.github.com" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "Free exFAT implementation" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "Free exFAT implementation 1.3.0" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "exfat" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "https://github.com/relan/exfat" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "1.3.0" + +/* Define if block devices are not supported. */ +/* #undef USE_UBLIO */ + +/* Version number of package */ +#define VERSION "1.3.0" + +/* Enable large inode numbers on Mac OS X 10.5. */ +#ifndef _DARWIN_USE_64_BIT_INODE +# define _DARWIN_USE_64_BIT_INODE 1 +#endif + +/* Number of bits in a file offset, on hosts where this is settable. */ +/* #undef _FILE_OFFSET_BITS */ + +/* Define for large files, on AIX-style hosts. */ +/* #undef _LARGE_FILES */ diff --git a/src/gui/Lib/exfat/src/libexfat/exfat.h b/src/gui/Lib/exfat/src/libexfat/exfat.h new file mode 100644 index 0000000..8a8d982 --- /dev/null +++ b/src/gui/Lib/exfat/src/libexfat/exfat.h @@ -0,0 +1,255 @@ +/* + exfat.h (29.08.09) + Definitions of structures and constants used in exFAT file system + implementation. + + Free exFAT implementation. + Copyright (C) 2010-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef EXFAT_H_INCLUDED +#define EXFAT_H_INCLUDED + +#ifndef ANDROID +/* Android.bp is used instead of autotools when targeting Android */ +#include "config.h" +#endif +#include "compiler.h" +#include "exfatfs.h" +#include +#include +#include +#include +#include +#include + +#define EXFAT_NAME_MAX 255 +/* UTF-16 encodes code points up to U+FFFF as single 16-bit code units. + UTF-8 uses up to 3 bytes (i.e. 8-bit code units) to encode code points + up to U+FFFF. One additional character is for null terminator. */ +#define EXFAT_UTF8_NAME_BUFFER_MAX (EXFAT_NAME_MAX * 3 + 1) +#define EXFAT_UTF8_ENAME_BUFFER_MAX (EXFAT_ENAME_MAX * 3 + 1) + +#define SECTOR_SIZE(sb) (1 << (sb).sector_bits) +#define CLUSTER_SIZE(sb) (SECTOR_SIZE(sb) << (sb).spc_bits) +#define CLUSTER_INVALID(sb, c) ((c) < EXFAT_FIRST_DATA_CLUSTER || \ + (c) - EXFAT_FIRST_DATA_CLUSTER >= le32_to_cpu((sb).cluster_count)) + +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#define DIV_ROUND_UP(x, d) (((x) + (d) - 1) / (d)) +#define ROUND_UP(x, d) (DIV_ROUND_UP(x, d) * (d)) + +#define BMAP_SIZE(count) (ROUND_UP(count, sizeof(bitmap_t) * 8) / 8) +#define BMAP_BLOCK(index) ((index) / sizeof(bitmap_t) / 8) +#define BMAP_MASK(index) ((bitmap_t) 1 << ((index) % (sizeof(bitmap_t) * 8))) +#define BMAP_GET(bitmap, index) \ + ((bitmap)[BMAP_BLOCK(index)] & BMAP_MASK(index)) +#define BMAP_SET(bitmap, index) \ + ((bitmap)[BMAP_BLOCK(index)] |= BMAP_MASK(index)) +#define BMAP_CLR(bitmap, index) \ + ((bitmap)[BMAP_BLOCK(index)] &= ~BMAP_MASK(index)) + +#define EXFAT_REPAIR(hook, ef, ...) \ + (exfat_ask_to_fix(ef) && exfat_fix_ ## hook(ef, __VA_ARGS__)) + +/* The size of off_t type must be 64 bits. File systems larger than 2 GB will + be corrupted with 32-bit off_t. */ +STATIC_ASSERT(sizeof(off_t) == 8); + +struct exfat_node +{ + struct exfat_node* parent; + struct exfat_node* child; + struct exfat_node* next; + struct exfat_node* prev; + + int references; + uint32_t fptr_index; + cluster_t fptr_cluster; + off_t entry_offset; + cluster_t start_cluster; + uint16_t attrib; + uint8_t continuations; + bool is_contiguous : 1; + bool is_cached : 1; + bool is_dirty : 1; + bool is_unlinked : 1; + uint64_t size; + time_t mtime, atime; + le16_t name[EXFAT_NAME_MAX + 1]; +}; + +enum exfat_mode +{ + EXFAT_MODE_RO, + EXFAT_MODE_RW, + EXFAT_MODE_ANY, +}; + +struct exfat_dev; + +struct exfat +{ + struct exfat_dev* dev; + struct exfat_super_block* sb; + uint16_t* upcase; + struct exfat_node* root; + struct + { + cluster_t start_cluster; + uint32_t size; /* in bits */ + bitmap_t* chunk; + uint32_t chunk_size; /* in bits */ + bool dirty; + } + cmap; + char label[EXFAT_UTF8_ENAME_BUFFER_MAX]; + void* zero_cluster; + int dmask, fmask; + uid_t uid; + gid_t gid; + int ro; + bool noatime; + enum { EXFAT_REPAIR_NO, EXFAT_REPAIR_ASK, EXFAT_REPAIR_YES } repair; +}; + +/* in-core nodes iterator */ +struct exfat_iterator +{ + struct exfat_node* parent; + struct exfat_node* current; +}; + +struct exfat_human_bytes +{ + uint64_t value; + const char* unit; +}; + +extern int exfat_errors; +extern int exfat_errors_fixed; + +#define VLOG_LOG 1 +#define VLOG_DEBUG 2 +void hiperiso_syslog_newline(int level, const char *Fmt, ...); +#define exfat_bug(fmt, args...) hiperiso_syslog_newline(VLOG_LOG, fmt, ##args) +#define exfat_error(fmt, args...) hiperiso_syslog_newline(VLOG_LOG, fmt, ##args) +#define exfat_error(fmt, args...) hiperiso_syslog_newline(VLOG_LOG, fmt, ##args) +#define exfat_warn(fmt, args...) hiperiso_syslog_newline(VLOG_LOG, fmt, ##args) +#define exfat_debug(fmt, args...) hiperiso_syslog_newline(VLOG_DEBUG, fmt, ##args) + +#if 0 +void exfat_bug(const char* format, ...) PRINTF NORETURN; +void exfat_error(const char* format, ...) PRINTF; +void exfat_warn(const char* format, ...) PRINTF; +void exfat_debug(const char* format, ...) PRINTF; +#endif /* #if 0 */ + +struct exfat_dev* exfat_open(const char* spec, enum exfat_mode mode); +int exfat_close(struct exfat_dev* dev); +int exfat_fsync(struct exfat_dev* dev); +enum exfat_mode exfat_get_mode(const struct exfat_dev* dev); +off_t exfat_get_size(const struct exfat_dev* dev); +off_t exfat_seek(struct exfat_dev* dev, off_t offset, int whence); +ssize_t exfat_read(struct exfat_dev* dev, void* buffer, size_t size); +ssize_t exfat_write(struct exfat_dev* dev, const void* buffer, size_t size); +ssize_t exfat_pread(struct exfat_dev* dev, void* buffer, size_t size, + off_t offset); +ssize_t exfat_pwrite(struct exfat_dev* dev, const void* buffer, size_t size, + off_t offset); +ssize_t exfat_generic_pread(const struct exfat* ef, struct exfat_node* node, + void* buffer, size_t size, off_t offset); +ssize_t exfat_generic_pwrite(struct exfat* ef, struct exfat_node* node, + const void* buffer, size_t size, off_t offset); + +int exfat_opendir(struct exfat* ef, struct exfat_node* dir, + struct exfat_iterator* it); +void exfat_closedir(struct exfat* ef, struct exfat_iterator* it); +struct exfat_node* exfat_readdir(struct exfat_iterator* it); +int exfat_lookup(struct exfat* ef, struct exfat_node** node, + const char* path); +int exfat_split(struct exfat* ef, struct exfat_node** parent, + struct exfat_node** node, le16_t* name, const char* path); + +off_t exfat_c2o(const struct exfat* ef, cluster_t cluster); +cluster_t exfat_next_cluster(const struct exfat* ef, + const struct exfat_node* node, cluster_t cluster); +cluster_t exfat_advance_cluster(const struct exfat* ef, + struct exfat_node* node, uint32_t count); +int exfat_flush_nodes(struct exfat* ef); +int exfat_flush(struct exfat* ef); +int exfat_truncate(struct exfat* ef, struct exfat_node* node, uint64_t size, + bool erase); +uint32_t exfat_count_free_clusters(const struct exfat* ef); +int exfat_find_used_sectors(const struct exfat* ef, off_t* a, off_t* b); + +void exfat_stat(const struct exfat* ef, const struct exfat_node* node, + struct stat* stbuf); +void exfat_get_name(const struct exfat_node* node, + char buffer[EXFAT_UTF8_NAME_BUFFER_MAX]); +uint16_t exfat_start_checksum(const struct exfat_entry_meta1* entry); +uint16_t exfat_add_checksum(const void* entry, uint16_t sum); +le16_t exfat_calc_checksum(const struct exfat_entry* entries, int n); +uint32_t exfat_vbr_start_checksum(const void* sector, size_t size); +uint32_t exfat_vbr_add_checksum(const void* sector, size_t size, uint32_t sum); +le16_t exfat_calc_name_hash(const struct exfat* ef, const le16_t* name, + size_t length); +void exfat_humanize_bytes(uint64_t value, struct exfat_human_bytes* hb); +void exfat_print_info(const struct exfat_super_block* sb, + uint32_t free_clusters); + +int utf16_to_utf8(char* output, const le16_t* input, size_t outsize, + size_t insize); +int utf8_to_utf16(le16_t* output, const char* input, size_t outsize, + size_t insize); +size_t utf16_length(const le16_t* str); + +struct exfat_node* exfat_get_node(struct exfat_node* node); +void exfat_put_node(struct exfat* ef, struct exfat_node* node); +int exfat_cleanup_node(struct exfat* ef, struct exfat_node* node); +int exfat_cache_directory(struct exfat* ef, struct exfat_node* dir); +void exfat_reset_cache(struct exfat* ef); +int exfat_flush_node(struct exfat* ef, struct exfat_node* node); +int exfat_unlink(struct exfat* ef, struct exfat_node* node); +int exfat_rmdir(struct exfat* ef, struct exfat_node* node); +int exfat_mknod(struct exfat* ef, const char* path); +int exfat_mkdir(struct exfat* ef, const char* path); +int exfat_rename(struct exfat* ef, const char* old_path, const char* new_path); +void exfat_utimes(struct exfat_node* node, const struct timespec tv[2]); +void exfat_update_atime(struct exfat_node* node); +void exfat_update_mtime(struct exfat_node* node); +const char* exfat_get_label(struct exfat* ef); +int exfat_set_label(struct exfat* ef, const char* label); + +int exfat_mount(struct exfat* ef, const char* spec, const char* options); +void exfat_unmount(struct exfat* ef); + +time_t exfat_exfat2unix(le16_t date, le16_t time, uint8_t centisec); +void exfat_unix2exfat(time_t unix_time, le16_t* date, le16_t* time, + uint8_t* centisec); +void exfat_tzset(void); + +bool exfat_ask_to_fix(const struct exfat* ef); +bool exfat_fix_invalid_vbr_checksum(const struct exfat* ef, void* sector, + uint32_t vbr_checksum); +bool exfat_fix_invalid_node_checksum(const struct exfat* ef, + struct exfat_node* node); +bool exfat_fix_unknown_entry(struct exfat* ef, struct exfat_node* dir, + const struct exfat_entry* entry, off_t offset); + +#endif /* ifndef EXFAT_H_INCLUDED */ diff --git a/src/gui/Lib/exfat/src/libexfat/exfatfs.h b/src/gui/Lib/exfat/src/libexfat/exfatfs.h new file mode 100644 index 0000000..b7b6cac --- /dev/null +++ b/src/gui/Lib/exfat/src/libexfat/exfatfs.h @@ -0,0 +1,180 @@ +/* + exfatfs.h (29.08.09) + Definitions of structures and constants used in exFAT file system. + + Free exFAT implementation. + Copyright (C) 2010-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef EXFATFS_H_INCLUDED +#define EXFATFS_H_INCLUDED + +#include "byteorder.h" +#include "compiler.h" + +typedef uint32_t cluster_t; /* cluster number */ + +#define EXFAT_FIRST_DATA_CLUSTER 2 +#define EXFAT_LAST_DATA_CLUSTER 0xfffffff6 + +#define EXFAT_CLUSTER_FREE 0 /* free cluster */ +#define EXFAT_CLUSTER_BAD 0xfffffff7 /* cluster contains bad sector */ +#define EXFAT_CLUSTER_END 0xffffffff /* final cluster of file or directory */ + +#define EXFAT_STATE_MOUNTED 2 + +struct exfat_super_block +{ + uint8_t jump[3]; /* 0x00 jmp and nop instructions */ + uint8_t oem_name[8]; /* 0x03 "EXFAT " */ + uint8_t __unused1[53]; /* 0x0B always 0 */ + le64_t sector_start; /* 0x40 partition first sector */ + le64_t sector_count; /* 0x48 partition sectors count */ + le32_t fat_sector_start; /* 0x50 FAT first sector */ + le32_t fat_sector_count; /* 0x54 FAT sectors count */ + le32_t cluster_sector_start; /* 0x58 first cluster sector */ + le32_t cluster_count; /* 0x5C total clusters count */ + le32_t rootdir_cluster; /* 0x60 first cluster of the root dir */ + le32_t volume_serial; /* 0x64 volume serial number */ + struct /* 0x68 FS version */ + { + uint8_t minor; + uint8_t major; + } + version; + le16_t volume_state; /* 0x6A volume state flags */ + uint8_t sector_bits; /* 0x6C sector size as (1 << n) */ + uint8_t spc_bits; /* 0x6D sectors per cluster as (1 << n) */ + uint8_t fat_count; /* 0x6E always 1 */ + uint8_t drive_no; /* 0x6F always 0x80 */ + uint8_t allocated_percent; /* 0x70 percentage of allocated space */ + uint8_t __unused2[397]; /* 0x71 always 0 */ + le16_t boot_signature; /* the value of 0xAA55 */ +} +PACKED; +STATIC_ASSERT(sizeof(struct exfat_super_block) == 512); + +#define EXFAT_ENTRY_VALID 0x80 +#define EXFAT_ENTRY_CONTINUED 0x40 +#define EXFAT_ENTRY_OPTIONAL 0x20 + +#define EXFAT_ENTRY_BITMAP (0x01 | EXFAT_ENTRY_VALID) +#define EXFAT_ENTRY_UPCASE (0x02 | EXFAT_ENTRY_VALID) +#define EXFAT_ENTRY_LABEL (0x03 | EXFAT_ENTRY_VALID) +#define EXFAT_ENTRY_FILE (0x05 | EXFAT_ENTRY_VALID) +#define EXFAT_ENTRY_FILE_INFO (0x00 | EXFAT_ENTRY_VALID | EXFAT_ENTRY_CONTINUED) +#define EXFAT_ENTRY_FILE_NAME (0x01 | EXFAT_ENTRY_VALID | EXFAT_ENTRY_CONTINUED) +#define EXFAT_ENTRY_FILE_TAIL (0x00 | EXFAT_ENTRY_VALID \ + | EXFAT_ENTRY_CONTINUED \ + | EXFAT_ENTRY_OPTIONAL) + +struct exfat_entry /* common container for all entries */ +{ + uint8_t type; /* any of EXFAT_ENTRY_xxx */ + uint8_t data[31]; +} +PACKED; +STATIC_ASSERT(sizeof(struct exfat_entry) == 32); + +#define EXFAT_ENAME_MAX 15 + +struct exfat_entry_bitmap /* allocated clusters bitmap */ +{ + uint8_t type; /* EXFAT_ENTRY_BITMAP */ + uint8_t __unknown1[19]; + le32_t start_cluster; + le64_t size; /* in bytes */ +} +PACKED; +STATIC_ASSERT(sizeof(struct exfat_entry_bitmap) == 32); + +#define EXFAT_UPCASE_CHARS 0x10000 + +struct exfat_entry_upcase /* upper case translation table */ +{ + uint8_t type; /* EXFAT_ENTRY_UPCASE */ + uint8_t __unknown1[3]; + le32_t checksum; + uint8_t __unknown2[12]; + le32_t start_cluster; + le64_t size; /* in bytes */ +} +PACKED; +STATIC_ASSERT(sizeof(struct exfat_entry_upcase) == 32); + +struct exfat_entry_label /* volume label */ +{ + uint8_t type; /* EXFAT_ENTRY_LABEL */ + uint8_t length; /* number of characters */ + le16_t name[EXFAT_ENAME_MAX]; /* in UTF-16LE */ +} +PACKED; +STATIC_ASSERT(sizeof(struct exfat_entry_label) == 32); + +#define EXFAT_ATTRIB_RO 0x01 +#define EXFAT_ATTRIB_HIDDEN 0x02 +#define EXFAT_ATTRIB_SYSTEM 0x04 +#define EXFAT_ATTRIB_VOLUME 0x08 +#define EXFAT_ATTRIB_DIR 0x10 +#define EXFAT_ATTRIB_ARCH 0x20 + +struct exfat_entry_meta1 /* file or directory info (part 1) */ +{ + uint8_t type; /* EXFAT_ENTRY_FILE */ + uint8_t continuations; + le16_t checksum; + le16_t attrib; /* combination of EXFAT_ATTRIB_xxx */ + le16_t __unknown1; + le16_t crtime, crdate; /* creation date and time */ + le16_t mtime, mdate; /* latest modification date and time */ + le16_t atime, adate; /* latest access date and time */ + uint8_t crtime_cs; /* creation time in cs (centiseconds) */ + uint8_t mtime_cs; /* latest modification time in cs */ + uint8_t __unknown2[10]; +} +PACKED; +STATIC_ASSERT(sizeof(struct exfat_entry_meta1) == 32); + +#define EXFAT_FLAG_ALWAYS1 (1u << 0) +#define EXFAT_FLAG_CONTIGUOUS (1u << 1) + +struct exfat_entry_meta2 /* file or directory info (part 2) */ +{ + uint8_t type; /* EXFAT_ENTRY_FILE_INFO */ + uint8_t flags; /* combination of EXFAT_FLAG_xxx */ + uint8_t __unknown1; + uint8_t name_length; + le16_t name_hash; + le16_t __unknown2; + le64_t valid_size; /* in bytes, less or equal to size */ + uint8_t __unknown3[4]; + le32_t start_cluster; + le64_t size; /* in bytes */ +} +PACKED; +STATIC_ASSERT(sizeof(struct exfat_entry_meta2) == 32); + +struct exfat_entry_name /* file or directory name */ +{ + uint8_t type; /* EXFAT_ENTRY_FILE_NAME */ + uint8_t __unknown; + le16_t name[EXFAT_ENAME_MAX]; /* in UTF-16LE */ +} +PACKED; +STATIC_ASSERT(sizeof(struct exfat_entry_name) == 32); + +#endif /* ifndef EXFATFS_H_INCLUDED */ diff --git a/src/gui/Lib/exfat/src/libexfat/io.c b/src/gui/Lib/exfat/src/libexfat/io.c new file mode 100644 index 0000000..3808cae --- /dev/null +++ b/src/gui/Lib/exfat/src/libexfat/io.c @@ -0,0 +1,511 @@ +/* + io.c (02.09.09) + exFAT file system implementation library. + + Free exFAT implementation. + Copyright (C) 2010-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "exfat.h" +#include +#include +#include +#include +#include +#include +#include +#if defined(__APPLE__) +#include +#elif defined(__OpenBSD__) +#include +#include +#include +#include +#elif __linux__ +#include +#endif +#ifdef USE_UBLIO +#include +#include +#endif + +struct exfat_dev +{ + int fd; + enum exfat_mode mode; + off_t size; /* in bytes */ +#ifdef USE_UBLIO + off_t pos; + ublio_filehandle_t ufh; +#endif +}; + +int g_hiso_exfat_disk_fd = -1; +uint64_t g_hiso_exfat_part_size = 0; + +static bool is_open(int fd) +{ + return fcntl(fd, F_GETFD) != -1; +} + +static int open_ro(const char* spec) +{ + return open(spec, O_RDONLY); +} + +static int open_rw(const char* spec) +{ + int fd = open(spec, O_RDWR); +#ifdef __linux__ + int ro = 0; + + /* + This ioctl is needed because after "blockdev --setro" kernel still + allows to open the device in read-write mode but fails writes. + */ + if (fd != -1 && ioctl(fd, BLKROGET, &ro) == 0 && ro) + { + close(fd); + errno = EROFS; + return -1; + } +#endif + return fd; +} + +struct exfat_dev* exfat_open(const char* spec, enum exfat_mode mode) +{ + struct exfat_dev* dev; + struct stat stbuf; +#ifdef USE_UBLIO + struct ublio_param up; +#endif + + /* The system allocates file descriptors sequentially. If we have been + started with stdin (0), stdout (1) or stderr (2) closed, the system + will give us descriptor 0, 1 or 2 later when we open block device, + FUSE communication pipe, etc. As a result, functions using stdin, + stdout or stderr will actually work with a different thing and can + corrupt it. Protect descriptors 0, 1 and 2 from such misuse. */ + while (!is_open(STDIN_FILENO) + || !is_open(STDOUT_FILENO) + || !is_open(STDERR_FILENO)) + { + /* we don't need those descriptors, let them leak */ + if (open("/dev/null", O_RDWR) == -1) + { + exfat_error("failed to open /dev/null"); + return NULL; + } + } + + dev = malloc(sizeof(struct exfat_dev)); + if (dev == NULL) + { + exfat_error("failed to allocate memory for device structure"); + return NULL; + } + + switch (mode) + { + case EXFAT_MODE_RO: + dev->fd = g_hiso_exfat_disk_fd < 0 ? open_ro(spec) : g_hiso_exfat_disk_fd; + if (dev->fd == -1) + { + free(dev); + exfat_error("failed to open '%s' in read-only mode: %s", spec, + strerror(errno)); + return NULL; + } + dev->mode = EXFAT_MODE_RO; + break; + case EXFAT_MODE_RW: + dev->fd = g_hiso_exfat_disk_fd < 0 ? open_rw(spec) : g_hiso_exfat_disk_fd; + if (dev->fd == -1) + { + free(dev); + exfat_error("failed to open '%s' in read-write mode: %s", spec, + strerror(errno)); + return NULL; + } + dev->mode = EXFAT_MODE_RW; + break; + case EXFAT_MODE_ANY: + dev->fd = g_hiso_exfat_disk_fd < 0 ? open_rw(spec) : g_hiso_exfat_disk_fd; + if (dev->fd != -1) + { + dev->mode = EXFAT_MODE_RW; + break; + } + dev->fd = g_hiso_exfat_disk_fd < 0 ? open_ro(spec) : g_hiso_exfat_disk_fd; + if (dev->fd != -1) + { + dev->mode = EXFAT_MODE_RO; + exfat_warn("'%s' is write-protected, mounting read-only", spec); + break; + } + free(dev); + exfat_error("failed to open '%s': %s", spec, strerror(errno)); + return NULL; + } + + if (fstat(dev->fd, &stbuf) != 0) + { + close(dev->fd); + free(dev); + exfat_error("failed to fstat '%s'", spec); + return NULL; + } + if (!S_ISBLK(stbuf.st_mode) && + !S_ISCHR(stbuf.st_mode) && + !S_ISREG(stbuf.st_mode)) + { + close(dev->fd); + free(dev); + exfat_error("'%s' is neither a device, nor a regular file", spec); + return NULL; + } + +#if defined(__APPLE__) + if (!S_ISREG(stbuf.st_mode)) + { + uint32_t block_size = 0; + uint64_t blocks = 0; + + if (ioctl(dev->fd, DKIOCGETBLOCKSIZE, &block_size) != 0) + { + close(dev->fd); + free(dev); + exfat_error("failed to get block size"); + return NULL; + } + if (ioctl(dev->fd, DKIOCGETBLOCKCOUNT, &blocks) != 0) + { + close(dev->fd); + free(dev); + exfat_error("failed to get blocks count"); + return NULL; + } + dev->size = blocks * block_size; + } + else +#elif defined(__OpenBSD__) + if (!S_ISREG(stbuf.st_mode)) + { + struct disklabel lab; + struct partition* pp; + char* partition; + + if (ioctl(dev->fd, DIOCGDINFO, &lab) == -1) + { + close(dev->fd); + free(dev); + exfat_error("failed to get disklabel"); + return NULL; + } + + /* Don't need to check that partition letter is valid as we won't get + this far otherwise. */ + partition = strchr(spec, '\0') - 1; + pp = &(lab.d_partitions[*partition - 'a']); + dev->size = DL_GETPSIZE(pp) * lab.d_secsize; + + if (pp->p_fstype != FS_NTFS) + exfat_warn("partition type is not 0x07 (NTFS/exFAT); " + "you can fix this with fdisk(8)"); + } + else +#endif + { + /* works for Linux, FreeBSD, Solaris */ + dev->size = exfat_seek(dev, 0, SEEK_END); + if (dev->size <= 0) + { + close(dev->fd); + free(dev); + exfat_error("failed to get size of '%s'", spec); + return NULL; + } + if (exfat_seek(dev, 0, SEEK_SET) == -1) + { + close(dev->fd); + free(dev); + exfat_error("failed to seek to the beginning of '%s'", spec); + return NULL; + } + } + +#ifdef USE_UBLIO + memset(&up, 0, sizeof(struct ublio_param)); + up.up_blocksize = 256 * 1024; + up.up_items = 64; + up.up_grace = 32; + up.up_priv = &dev->fd; + + dev->pos = 0; + dev->ufh = ublio_open(&up); + if (dev->ufh == NULL) + { + close(dev->fd); + free(dev); + exfat_error("failed to initialize ublio"); + return NULL; + } +#endif + + return dev; +} + +int exfat_close(struct exfat_dev* dev) +{ + int rc = 0; + +#ifdef USE_UBLIO + if (ublio_close(dev->ufh) != 0) + { + exfat_error("failed to close ublio"); + rc = -EIO; + } +#endif + if (dev->fd != g_hiso_exfat_disk_fd) + { + if (close(dev->fd) != 0) + { + exfat_error("failed to close device: %s", strerror(errno)); + rc = -EIO; + } + } + + free(dev); + return rc; +} + +int exfat_fsync(struct exfat_dev* dev) +{ + int rc = 0; + +#ifdef USE_UBLIO + if (ublio_fsync(dev->ufh) != 0) + { + exfat_error("ublio fsync failed"); + rc = -EIO; + } +#endif + if (fsync(dev->fd) != 0) + { + exfat_error("fsync failed: %s", strerror(errno)); + rc = -EIO; + } + return rc; +} + +enum exfat_mode exfat_get_mode(const struct exfat_dev* dev) +{ + return dev->mode; +} + + +off_t exfat_get_size(const struct exfat_dev* dev) +{ + return dev->size; +} + +off_t exfat_seek(struct exfat_dev* dev, off_t offset, int whence) +{ +#ifdef USE_UBLIO + /* XXX SEEK_CUR will be handled incorrectly */ + return dev->pos = lseek(dev->fd, offset, whence); +#else + + if (SEEK_SET == whence) + { + if (offset > g_hiso_exfat_part_size) + { + return -1; + } + + lseek(dev->fd, 512 * 2048 + offset, SEEK_SET); + return offset; + } + else if (SEEK_END == whence) + { + if (offset == 0) + { + offset = 512 * 2048 + g_hiso_exfat_part_size; + lseek(dev->fd, offset, SEEK_SET); + return (off_t)g_hiso_exfat_part_size; + } + else + { + exfat_error("Invalid SEEK_END offset %llu", (unsigned long long)offset); + return -1; + } + } + else + { + exfat_error("Invalid seek whence %d", whence); + return lseek(dev->fd, offset, whence); + } +#endif +} + +ssize_t exfat_read(struct exfat_dev* dev, void* buffer, size_t size) +{ +#ifdef USE_UBLIO + ssize_t result = ublio_pread(dev->ufh, buffer, size, dev->pos); + if (result >= 0) + dev->pos += size; + return result; +#else + return read(dev->fd, buffer, size); +#endif +} + +ssize_t exfat_write(struct exfat_dev* dev, const void* buffer, size_t size) +{ +#ifdef USE_UBLIO + ssize_t result = ublio_pwrite(dev->ufh, buffer, size, dev->pos); + if (result >= 0) + dev->pos += size; + return result; +#else + return write(dev->fd, buffer, size); +#endif +} + +ssize_t exfat_pread(struct exfat_dev* dev, void* buffer, size_t size, + off_t offset) +{ +#ifdef USE_UBLIO + return ublio_pread(dev->ufh, buffer, size, offset); +#else + return pread(dev->fd, buffer, size, offset); +#endif +} + +ssize_t exfat_pwrite(struct exfat_dev* dev, const void* buffer, size_t size, + off_t offset) +{ +#ifdef USE_UBLIO + return ublio_pwrite(dev->ufh, buffer, size, offset); +#else + return pwrite(dev->fd, buffer, size, offset); +#endif +} + +ssize_t exfat_generic_pread(const struct exfat* ef, struct exfat_node* node, + void* buffer, size_t size, off_t offset) +{ + cluster_t cluster; + char* bufp = buffer; + off_t lsize, loffset, remainder; + + if (offset >= node->size) + return 0; + if (size == 0) + return 0; + + cluster = exfat_advance_cluster(ef, node, offset / CLUSTER_SIZE(*ef->sb)); + if (CLUSTER_INVALID(*ef->sb, cluster)) + { + exfat_error("invalid cluster 0x%x while reading", cluster); + return -EIO; + } + + loffset = offset % CLUSTER_SIZE(*ef->sb); + remainder = MIN(size, node->size - offset); + while (remainder > 0) + { + if (CLUSTER_INVALID(*ef->sb, cluster)) + { + exfat_error("invalid cluster 0x%x while reading", cluster); + return -EIO; + } + lsize = MIN(CLUSTER_SIZE(*ef->sb) - loffset, remainder); + if (exfat_pread(ef->dev, bufp, lsize, + exfat_c2o(ef, cluster) + loffset) < 0) + { + exfat_error("failed to read cluster %#x", cluster); + return -EIO; + } + bufp += lsize; + loffset = 0; + remainder -= lsize; + cluster = exfat_next_cluster(ef, node, cluster); + } + if (!(node->attrib & EXFAT_ATTRIB_DIR) && !ef->ro && !ef->noatime) + exfat_update_atime(node); + return MIN(size, node->size - offset) - remainder; +} + +ssize_t exfat_generic_pwrite(struct exfat* ef, struct exfat_node* node, + const void* buffer, size_t size, off_t offset) +{ + int rc; + cluster_t cluster; + const char* bufp = buffer; + off_t lsize, loffset, remainder; + + if (offset > node->size) + { + rc = exfat_truncate(ef, node, offset, true); + if (rc != 0) + return rc; + } + if (offset + size > node->size) + { + rc = exfat_truncate(ef, node, offset + size, false); + if (rc != 0) + return rc; + } + if (size == 0) + return 0; + + cluster = exfat_advance_cluster(ef, node, offset / CLUSTER_SIZE(*ef->sb)); + if (CLUSTER_INVALID(*ef->sb, cluster)) + { + exfat_error("invalid cluster 0x%x while writing", cluster); + return -EIO; + } + + loffset = offset % CLUSTER_SIZE(*ef->sb); + remainder = size; + while (remainder > 0) + { + if (CLUSTER_INVALID(*ef->sb, cluster)) + { + exfat_error("invalid cluster 0x%x while writing", cluster); + return -EIO; + } + lsize = MIN(CLUSTER_SIZE(*ef->sb) - loffset, remainder); + if (exfat_pwrite(ef->dev, bufp, lsize, + exfat_c2o(ef, cluster) + loffset) < 0) + { + exfat_error("failed to write cluster %#x", cluster); + return -EIO; + } + bufp += lsize; + loffset = 0; + remainder -= lsize; + cluster = exfat_next_cluster(ef, node, cluster); + } + if (!(node->attrib & EXFAT_ATTRIB_DIR)) + /* directory's mtime should be updated by the caller only when it + creates or removes something in this directory */ + exfat_update_mtime(node); + return size - remainder; +} diff --git a/src/gui/Lib/exfat/src/libexfat/lookup.c b/src/gui/Lib/exfat/src/libexfat/lookup.c new file mode 100644 index 0000000..8fa8e0f --- /dev/null +++ b/src/gui/Lib/exfat/src/libexfat/lookup.c @@ -0,0 +1,224 @@ +/* + lookup.c (02.09.09) + exFAT file system implementation library. + + Free exFAT implementation. + Copyright (C) 2010-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "exfat.h" +#include +#include +#include + +int exfat_opendir(struct exfat* ef, struct exfat_node* dir, + struct exfat_iterator* it) +{ + int rc; + + exfat_get_node(dir); + it->parent = dir; + it->current = NULL; + rc = exfat_cache_directory(ef, dir); + if (rc != 0) + exfat_put_node(ef, dir); + return rc; +} + +void exfat_closedir(struct exfat* ef, struct exfat_iterator* it) +{ + exfat_put_node(ef, it->parent); + it->parent = NULL; + it->current = NULL; +} + +struct exfat_node* exfat_readdir(struct exfat_iterator* it) +{ + if (it->current == NULL) + it->current = it->parent->child; + else + it->current = it->current->next; + + if (it->current != NULL) + return exfat_get_node(it->current); + else + return NULL; +} + +static int compare_char(struct exfat* ef, uint16_t a, uint16_t b) +{ + return (int) ef->upcase[a] - (int) ef->upcase[b]; +} + +static int compare_name(struct exfat* ef, const le16_t* a, const le16_t* b) +{ + while (le16_to_cpu(*a) && le16_to_cpu(*b)) + { + int rc = compare_char(ef, le16_to_cpu(*a), le16_to_cpu(*b)); + if (rc != 0) + return rc; + a++; + b++; + } + return compare_char(ef, le16_to_cpu(*a), le16_to_cpu(*b)); +} + +static int lookup_name(struct exfat* ef, struct exfat_node* parent, + struct exfat_node** node, const char* name, size_t n) +{ + struct exfat_iterator it; + le16_t buffer[EXFAT_NAME_MAX + 1]; + int rc; + + *node = NULL; + + rc = utf8_to_utf16(buffer, name, EXFAT_NAME_MAX + 1, n); + if (rc != 0) + return rc; + + rc = exfat_opendir(ef, parent, &it); + if (rc != 0) + return rc; + while ((*node = exfat_readdir(&it))) + { + if (compare_name(ef, buffer, (*node)->name) == 0) + { + exfat_closedir(ef, &it); + return 0; + } + exfat_put_node(ef, *node); + } + exfat_closedir(ef, &it); + return -ENOENT; +} + +static size_t get_comp(const char* path, const char** comp) +{ + const char* end; + + *comp = path + strspn(path, "/"); /* skip leading slashes */ + end = strchr(*comp, '/'); + if (end == NULL) + return strlen(*comp); + else + return end - *comp; +} + +int exfat_lookup(struct exfat* ef, struct exfat_node** node, + const char* path) +{ + struct exfat_node* parent; + const char* p; + size_t n; + int rc; + + /* start from the root directory */ + parent = *node = exfat_get_node(ef->root); + for (p = path; (n = get_comp(p, &p)); p += n) + { + if (n == 1 && *p == '.') /* skip "." component */ + continue; + rc = lookup_name(ef, parent, node, p, n); + if (rc != 0) + { + exfat_put_node(ef, parent); + return rc; + } + exfat_put_node(ef, parent); + parent = *node; + } + return 0; +} + +static bool is_last_comp(const char* comp, size_t length) +{ + const char* p = comp + length; + + return get_comp(p, &p) == 0; +} + +static bool is_allowed(const char* comp, size_t length) +{ + size_t i; + + for (i = 0; i < length; i++) + switch (comp[i]) + { + case 0x01 ... 0x1f: + case '/': + case '\\': + case ':': + case '*': + case '?': + case '"': + case '<': + case '>': + case '|': + return false; + } + return true; +} + +int exfat_split(struct exfat* ef, struct exfat_node** parent, + struct exfat_node** node, le16_t* name, const char* path) +{ + const char* p; + size_t n; + int rc; + + memset(name, 0, (EXFAT_NAME_MAX + 1) * sizeof(le16_t)); + *parent = *node = exfat_get_node(ef->root); + for (p = path; (n = get_comp(p, &p)); p += n) + { + if (n == 1 && *p == '.') + continue; + if (is_last_comp(p, n)) + { + if (!is_allowed(p, n)) + { + /* contains characters that are not allowed */ + exfat_put_node(ef, *parent); + return -ENOENT; + } + rc = utf8_to_utf16(name, p, EXFAT_NAME_MAX + 1, n); + if (rc != 0) + { + exfat_put_node(ef, *parent); + return rc; + } + + rc = lookup_name(ef, *parent, node, p, n); + if (rc != 0 && rc != -ENOENT) + { + exfat_put_node(ef, *parent); + return rc; + } + return 0; + } + rc = lookup_name(ef, *parent, node, p, n); + if (rc != 0) + { + exfat_put_node(ef, *parent); + return rc; + } + exfat_put_node(ef, *parent); + *parent = *node; + } + exfat_bug("impossible"); + + return 1; +} diff --git a/src/gui/Lib/exfat/src/libexfat/mount.c b/src/gui/Lib/exfat/src/libexfat/mount.c new file mode 100644 index 0000000..4284aee --- /dev/null +++ b/src/gui/Lib/exfat/src/libexfat/mount.c @@ -0,0 +1,389 @@ +/* + mount.c (22.10.09) + exFAT file system implementation library. + + Free exFAT implementation. + Copyright (C) 2010-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "exfat.h" +#include +#include +#include +#include +#include +#include + +static uint64_t rootdir_size(const struct exfat* ef) +{ + uint32_t clusters = 0; + uint32_t clusters_max = le32_to_cpu(ef->sb->cluster_count); + cluster_t rootdir_cluster = le32_to_cpu(ef->sb->rootdir_cluster); + + /* Iterate all clusters of the root directory to calculate its size. + It can't be contiguous because there is no flag to indicate this. */ + do + { + if (clusters == clusters_max) /* infinite loop detected */ + { + exfat_error("root directory cannot occupy all %d clusters", + clusters); + return 0; + } + if (CLUSTER_INVALID(*ef->sb, rootdir_cluster)) + { + exfat_error("bad cluster %#x while reading root directory", + rootdir_cluster); + return 0; + } + rootdir_cluster = exfat_next_cluster(ef, ef->root, rootdir_cluster); + clusters++; + } + while (rootdir_cluster != EXFAT_CLUSTER_END); + + return (uint64_t) clusters * CLUSTER_SIZE(*ef->sb); +} + +static const char* get_option(const char* options, const char* option_name) +{ + const char* p; + size_t length = strlen(option_name); + + for (p = strstr(options, option_name); p; p = strstr(p + 1, option_name)) + if ((p == options || p[-1] == ',') && p[length] == '=') + return p + length + 1; + return NULL; +} + +static int get_int_option(const char* options, const char* option_name, + int base, int default_value) +{ + const char* p = get_option(options, option_name); + + if (p == NULL) + return default_value; + return strtol(p, NULL, base); +} + +static bool match_option(const char* options, const char* option_name) +{ + const char* p; + size_t length = strlen(option_name); + + for (p = strstr(options, option_name); p; p = strstr(p + 1, option_name)) + if ((p == options || p[-1] == ',') && + (p[length] == ',' || p[length] == '\0')) + return true; + return false; +} + +static void parse_options(struct exfat* ef, const char* options) +{ + int opt_umask; + + opt_umask = get_int_option(options, "umask", 8, 0); + ef->dmask = get_int_option(options, "dmask", 8, opt_umask); + ef->fmask = get_int_option(options, "fmask", 8, opt_umask); + + ef->uid = get_int_option(options, "uid", 10, geteuid()); + ef->gid = get_int_option(options, "gid", 10, getegid()); + + ef->noatime = match_option(options, "noatime"); + + switch (get_int_option(options, "repair", 10, 0)) + { + case 1: + ef->repair = EXFAT_REPAIR_ASK; + break; + case 2: + ef->repair = EXFAT_REPAIR_YES; + break; + default: + ef->repair = EXFAT_REPAIR_NO; + break; + } +} + +static bool verify_vbr_checksum(const struct exfat* ef, void* sector) +{ + off_t sector_size = SECTOR_SIZE(*ef->sb); + uint32_t vbr_checksum; + int i; + + if (exfat_pread(ef->dev, sector, sector_size, 0) < 0) + { + exfat_error("failed to read boot sector"); + return false; + } + vbr_checksum = exfat_vbr_start_checksum(sector, sector_size); + for (i = 1; i < 11; i++) + { + if (exfat_pread(ef->dev, sector, sector_size, i * sector_size) < 0) + { + exfat_error("failed to read VBR sector"); + return false; + } + vbr_checksum = exfat_vbr_add_checksum(sector, sector_size, + vbr_checksum); + } + if (exfat_pread(ef->dev, sector, sector_size, i * sector_size) < 0) + { + exfat_error("failed to read VBR checksum sector"); + return false; + } + for (i = 0; i < sector_size / sizeof(vbr_checksum); i++) + if (le32_to_cpu(((const le32_t*) sector)[i]) != vbr_checksum) + { + exfat_error("invalid VBR checksum 0x%x (expected 0x%x)", + le32_to_cpu(((const le32_t*) sector)[i]), vbr_checksum); + if (!EXFAT_REPAIR(invalid_vbr_checksum, ef, sector, vbr_checksum)) + return false; + } + return true; +} + +static int commit_super_block(const struct exfat* ef) +{ + if (exfat_pwrite(ef->dev, ef->sb, sizeof(struct exfat_super_block), 0) < 0) + { + exfat_error("failed to write super block"); + return 1; + } + return exfat_fsync(ef->dev); +} + +static int prepare_super_block(const struct exfat* ef) +{ + if (le16_to_cpu(ef->sb->volume_state) & EXFAT_STATE_MOUNTED) + exfat_warn("volume was not unmounted cleanly"); + + if (ef->ro) + return 0; + + ef->sb->volume_state = cpu_to_le16( + le16_to_cpu(ef->sb->volume_state) | EXFAT_STATE_MOUNTED); + return commit_super_block(ef); +} + +static void exfat_free(struct exfat* ef) +{ + exfat_close(ef->dev); /* first of all, close the descriptor */ + ef->dev = NULL; /* struct exfat_dev is freed by exfat_close() */ + free(ef->root); + ef->root = NULL; + free(ef->zero_cluster); + ef->zero_cluster = NULL; + free(ef->cmap.chunk); + ef->cmap.chunk = NULL; + free(ef->upcase); + ef->upcase = NULL; + free(ef->sb); + ef->sb = NULL; +} + +int exfat_mount(struct exfat* ef, const char* spec, const char* options) +{ + int rc; + enum exfat_mode mode; + + exfat_tzset(); + memset(ef, 0, sizeof(struct exfat)); + + parse_options(ef, options); + + if (match_option(options, "ro")) + mode = EXFAT_MODE_RO; + else if (match_option(options, "ro_fallback")) + mode = EXFAT_MODE_ANY; + else + mode = EXFAT_MODE_RW; + ef->dev = exfat_open(spec, mode); + if (ef->dev == NULL) + return -EIO; + if (exfat_get_mode(ef->dev) == EXFAT_MODE_RO) + { + if (mode == EXFAT_MODE_ANY) + ef->ro = -1; + else + ef->ro = 1; + } + + ef->sb = malloc(sizeof(struct exfat_super_block)); + if (ef->sb == NULL) + { + exfat_error("failed to allocate memory for the super block"); + exfat_free(ef); + return -ENOMEM; + } + memset(ef->sb, 0, sizeof(struct exfat_super_block)); + + if (exfat_pread(ef->dev, ef->sb, sizeof(struct exfat_super_block), 0) < 0) + { + exfat_error("failed to read boot sector"); + exfat_free(ef); + return -EIO; + } + if (memcmp(ef->sb->oem_name, "EXFAT ", 8) != 0) + { + exfat_error("exFAT file system is not found"); + exfat_free(ef); + return -EIO; + } + /* sector cannot be smaller than 512 bytes */ + if (ef->sb->sector_bits < 9) + { + exfat_error("too small sector size: 2^%hhd", ef->sb->sector_bits); + exfat_free(ef); + return -EIO; + } + /* officially exFAT supports cluster size up to 32 MB */ + if ((int) ef->sb->sector_bits + (int) ef->sb->spc_bits > 25) + { + exfat_error("too big cluster size: 2^(%hhd+%hhd)", + ef->sb->sector_bits, ef->sb->spc_bits); + exfat_free(ef); + return -EIO; + } + ef->zero_cluster = malloc(CLUSTER_SIZE(*ef->sb)); + if (ef->zero_cluster == NULL) + { + exfat_error("failed to allocate zero sector"); + exfat_free(ef); + return -ENOMEM; + } + /* use zero_cluster as a temporary buffer for VBR checksum verification */ + if (!verify_vbr_checksum(ef, ef->zero_cluster)) + { + exfat_free(ef); + return -EIO; + } + memset(ef->zero_cluster, 0, CLUSTER_SIZE(*ef->sb)); + if (ef->sb->version.major != 1 || ef->sb->version.minor != 0) + { + exfat_error("unsupported exFAT version: %hhu.%hhu", + ef->sb->version.major, ef->sb->version.minor); + exfat_free(ef); + return -EIO; + } + if (ef->sb->fat_count != 1) + { + exfat_error("unsupported FAT count: %hhu", ef->sb->fat_count); + exfat_free(ef); + return -EIO; + } + if (le64_to_cpu(ef->sb->sector_count) * SECTOR_SIZE(*ef->sb) > + exfat_get_size(ef->dev)) + { + /* this can cause I/O errors later but we don't fail mounting to let + user rescue data */ + exfat_warn("file system in sectors is larger than device: " + "%"PRIu64" * %d > %"PRIu64, + le64_to_cpu(ef->sb->sector_count), SECTOR_SIZE(*ef->sb), + exfat_get_size(ef->dev)); + } + if ((off_t) le32_to_cpu(ef->sb->cluster_count) * CLUSTER_SIZE(*ef->sb) > + exfat_get_size(ef->dev)) + { + exfat_error("file system in clusters is larger than device: " + "%u * %d > %"PRIu64, + le32_to_cpu(ef->sb->cluster_count), CLUSTER_SIZE(*ef->sb), + exfat_get_size(ef->dev)); + exfat_free(ef); + return -EIO; + } + + ef->root = malloc(sizeof(struct exfat_node)); + if (ef->root == NULL) + { + exfat_error("failed to allocate root node"); + exfat_free(ef); + return -ENOMEM; + } + memset(ef->root, 0, sizeof(struct exfat_node)); + ef->root->attrib = EXFAT_ATTRIB_DIR; + ef->root->start_cluster = le32_to_cpu(ef->sb->rootdir_cluster); + ef->root->fptr_cluster = ef->root->start_cluster; + ef->root->name[0] = cpu_to_le16('\0'); + ef->root->size = rootdir_size(ef); + if (ef->root->size == 0) + { + exfat_free(ef); + return -EIO; + } + /* exFAT does not have time attributes for the root directory */ + ef->root->mtime = 0; + ef->root->atime = 0; + /* always keep at least 1 reference to the root node */ + exfat_get_node(ef->root); + + rc = exfat_cache_directory(ef, ef->root); + if (rc != 0) + goto error; + if (ef->upcase == NULL) + { + exfat_error("upcase table is not found"); + goto error; + } + if (ef->cmap.chunk == NULL) + { + exfat_error("clusters bitmap is not found"); + goto error; + } + + if (prepare_super_block(ef) != 0) + goto error; + + return 0; + +error: + exfat_put_node(ef, ef->root); + exfat_reset_cache(ef); + exfat_free(ef); + return -EIO; +} + +static void finalize_super_block(struct exfat* ef) +{ + if (ef->ro) + return; + + ef->sb->volume_state = cpu_to_le16( + le16_to_cpu(ef->sb->volume_state) & ~EXFAT_STATE_MOUNTED); + + /* Some implementations set the percentage of allocated space to 0xff + on FS creation and never update it. In this case leave it as is. */ + if (ef->sb->allocated_percent != 0xff) + { + uint32_t free, total; + + free = exfat_count_free_clusters(ef); + total = le32_to_cpu(ef->sb->cluster_count); + ef->sb->allocated_percent = ((total - free) * 100 + total / 2) / total; + } + + commit_super_block(ef); /* ignore return code */ +} + +void exfat_unmount(struct exfat* ef) +{ + exfat_flush_nodes(ef); /* ignore return code */ + exfat_flush(ef); /* ignore return code */ + exfat_put_node(ef, ef->root); + exfat_reset_cache(ef); + finalize_super_block(ef); + exfat_free(ef); /* will close the descriptor */ +} diff --git a/src/gui/Lib/exfat/src/libexfat/node.c b/src/gui/Lib/exfat/src/libexfat/node.c new file mode 100644 index 0000000..ab1d7d6 --- /dev/null +++ b/src/gui/Lib/exfat/src/libexfat/node.c @@ -0,0 +1,1226 @@ +/* + node.c (09.10.09) + exFAT file system implementation library. + + Free exFAT implementation. + Copyright (C) 2010-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "exfat.h" +#include +#include +#include + +#define EXFAT_ENTRY_NONE (-1) + +struct exfat_node* exfat_get_node(struct exfat_node* node) +{ + /* if we switch to multi-threaded mode we will need atomic + increment here and atomic decrement in exfat_put_node() */ + node->references++; + return node; +} + +void exfat_put_node(struct exfat* ef, struct exfat_node* node) +{ + char buffer[EXFAT_UTF8_NAME_BUFFER_MAX]; + + --node->references; + if (node->references < 0) + { + exfat_get_name(node, buffer); + exfat_bug("reference counter of '%s' is below zero", buffer); + } + else if (node->references == 0 && node != ef->root) + { + if (node->is_dirty) + { + exfat_get_name(node, buffer); + exfat_warn("dirty node '%s' with zero references", buffer); + } + } +} + +/** + * This function must be called on rmdir and unlink (after the last + * exfat_put_node()) to free clusters. + */ +int exfat_cleanup_node(struct exfat* ef, struct exfat_node* node) +{ + int rc = 0; + + if (node->references != 0) + exfat_bug("unable to cleanup a node with %d references", + node->references); + + if (node->is_unlinked) + { + /* free all clusters and node structure itself */ + rc = exfat_truncate(ef, node, 0, true); + /* free the node even in case of error or its memory will be lost */ + free(node); + } + return rc; +} + +static int read_entries(struct exfat* ef, struct exfat_node* dir, + struct exfat_entry* entries, int n, off_t offset) +{ + ssize_t size; + + if (!(dir->attrib & EXFAT_ATTRIB_DIR)) + exfat_bug("attempted to read entries from a file"); + + size = exfat_generic_pread(ef, dir, entries, + sizeof(struct exfat_entry[n]), offset); + if (size == sizeof(struct exfat_entry[n])) + return 0; /* success */ + if (size == 0) + return -ENOENT; + if (size < 0) + return -EIO; + exfat_error("read %zd bytes instead of %zu bytes", size, + sizeof(struct exfat_entry[n])); + return -EIO; +} + +static int write_entries(struct exfat* ef, struct exfat_node* dir, + const struct exfat_entry* entries, int n, off_t offset) +{ + ssize_t size; + + if (!(dir->attrib & EXFAT_ATTRIB_DIR)) + exfat_bug("attempted to write entries into a file"); + + size = exfat_generic_pwrite(ef, dir, entries, + sizeof(struct exfat_entry[n]), offset); + if (size == sizeof(struct exfat_entry[n])) + return 0; /* success */ + if (size < 0) + return -EIO; + exfat_error("wrote %zd bytes instead of %zu bytes", size, + sizeof(struct exfat_entry[n])); + return -EIO; +} + +static struct exfat_node* allocate_node(void) +{ + struct exfat_node* node = malloc(sizeof(struct exfat_node)); + if (node == NULL) + { + exfat_error("failed to allocate node"); + return NULL; + } + memset(node, 0, sizeof(struct exfat_node)); + return node; +} + +static void init_node_meta1(struct exfat_node* node, + const struct exfat_entry_meta1* meta1) +{ + node->attrib = le16_to_cpu(meta1->attrib); + node->continuations = meta1->continuations; + node->mtime = exfat_exfat2unix(meta1->mdate, meta1->mtime, + meta1->mtime_cs); + /* there is no centiseconds field for atime */ + node->atime = exfat_exfat2unix(meta1->adate, meta1->atime, 0); +} + +static void init_node_meta2(struct exfat_node* node, + const struct exfat_entry_meta2* meta2) +{ + node->size = le64_to_cpu(meta2->size); + node->start_cluster = le32_to_cpu(meta2->start_cluster); + node->fptr_cluster = node->start_cluster; + node->is_contiguous = ((meta2->flags & EXFAT_FLAG_CONTIGUOUS) != 0); +} + +static void init_node_name(struct exfat_node* node, + const struct exfat_entry* entries, int n) +{ + int i; + + for (i = 0; i < n; i++) + memcpy(node->name + i * EXFAT_ENAME_MAX, + ((const struct exfat_entry_name*) &entries[i])->name, + EXFAT_ENAME_MAX * sizeof(le16_t)); +} + +static bool check_entries(const struct exfat_entry* entry, int n) +{ + int previous = EXFAT_ENTRY_NONE; + int current; + int i; + + /* check transitions between entries types */ + for (i = 0; i < n + 1; previous = current, i++) + { + bool valid = false; + + current = (i < n) ? entry[i].type : EXFAT_ENTRY_NONE; + switch (previous) + { + case EXFAT_ENTRY_NONE: + valid = (current == EXFAT_ENTRY_FILE); + break; + case EXFAT_ENTRY_FILE: + valid = (current == EXFAT_ENTRY_FILE_INFO); + break; + case EXFAT_ENTRY_FILE_INFO: + valid = (current == EXFAT_ENTRY_FILE_NAME); + break; + case EXFAT_ENTRY_FILE_NAME: + valid = (current == EXFAT_ENTRY_FILE_NAME || + current == EXFAT_ENTRY_NONE || + current >= EXFAT_ENTRY_FILE_TAIL); + break; + case EXFAT_ENTRY_FILE_TAIL ... 0xff: + valid = (current >= EXFAT_ENTRY_FILE_TAIL || + current == EXFAT_ENTRY_NONE); + break; + } + + if (!valid) + { + exfat_error("unexpected entry type %#x after %#x at %d/%d", + current, previous, i, n); + return false; + } + } + return true; +} + +static bool check_node(const struct exfat* ef, struct exfat_node* node, + le16_t actual_checksum, const struct exfat_entry_meta1* meta1, + const struct exfat_entry_meta2* meta2) +{ + int cluster_size = CLUSTER_SIZE(*ef->sb); + uint64_t clusters_heap_size = + (uint64_t) le32_to_cpu(ef->sb->cluster_count) * cluster_size; + char buffer[EXFAT_UTF8_NAME_BUFFER_MAX]; + bool ret = true; + + /* + Validate checksum first. If it's invalid all other fields probably + contain just garbage. + */ + if (le16_to_cpu(actual_checksum) != le16_to_cpu(meta1->checksum)) + { + exfat_get_name(node, buffer); + exfat_error("'%s' has invalid checksum (%#hx != %#hx)", buffer, + le16_to_cpu(actual_checksum), le16_to_cpu(meta1->checksum)); + if (!EXFAT_REPAIR(invalid_node_checksum, ef, node)) + ret = false; + } + + /* + exFAT does not support sparse files but allows files with uninitialized + clusters. For such files valid_size means initialized data size and + cannot be greater than file size. See SetFileValidData() function + description in MSDN. + */ + if (le64_to_cpu(meta2->valid_size) > node->size) + { + exfat_get_name(node, buffer); + exfat_error("'%s' has valid size (%"PRIu64") greater than size " + "(%"PRIu64")", buffer, le64_to_cpu(meta2->valid_size), + node->size); + ret = false; + } + + /* + Empty file must have zero start cluster. Non-empty file must start + with a valid cluster. Directories cannot be empty (i.e. must always + have a valid start cluster), but we will check this later while + reading that directory to give user a chance to read this directory. + */ + if (node->size == 0 && node->start_cluster != EXFAT_CLUSTER_FREE) + { + exfat_get_name(node, buffer); + exfat_error("'%s' is empty but start cluster is %#x", buffer, + node->start_cluster); + ret = false; + } + if (node->size > 0 && CLUSTER_INVALID(*ef->sb, node->start_cluster)) + { + exfat_get_name(node, buffer); + exfat_error("'%s' points to invalid cluster %#x", buffer, + node->start_cluster); + ret = false; + } + + /* File or directory cannot be larger than clusters heap. */ + if (node->size > clusters_heap_size) + { + exfat_get_name(node, buffer); + exfat_error("'%s' is larger than clusters heap: %"PRIu64" > %"PRIu64, + buffer, node->size, clusters_heap_size); + ret = false; + } + + /* Empty file or directory must be marked as non-contiguous. */ + if (node->size == 0 && node->is_contiguous) + { + exfat_get_name(node, buffer); + exfat_error("'%s' is empty but marked as contiguous (%#hx)", buffer, + node->attrib); + ret = false; + } + + /* Directory size must be aligned on at cluster boundary. */ + if ((node->attrib & EXFAT_ATTRIB_DIR) && node->size % cluster_size != 0) + { + exfat_get_name(node, buffer); + exfat_error("'%s' directory size %"PRIu64" is not divisible by %d", buffer, + node->size, cluster_size); + ret = false; + } + + return ret; +} + +static int parse_file_entries(struct exfat* ef, struct exfat_node* node, + const struct exfat_entry* entries, int n) +{ + const struct exfat_entry_meta1* meta1; + const struct exfat_entry_meta2* meta2; + int mandatory_entries; + + if (!check_entries(entries, n)) + return -EIO; + + meta1 = (const struct exfat_entry_meta1*) &entries[0]; + if (meta1->continuations < 2) + { + exfat_error("too few continuations (%hhu)", meta1->continuations); + return -EIO; + } + meta2 = (const struct exfat_entry_meta2*) &entries[1]; + if (meta2->flags & ~(EXFAT_FLAG_ALWAYS1 | EXFAT_FLAG_CONTIGUOUS)) + { + exfat_error("unknown flags in meta2 (%#hhx)", meta2->flags); + return -EIO; + } + mandatory_entries = 2 + DIV_ROUND_UP(meta2->name_length, EXFAT_ENAME_MAX); + if (meta1->continuations < mandatory_entries - 1) + { + exfat_error("too few continuations (%hhu < %d)", + meta1->continuations, mandatory_entries - 1); + return -EIO; + } + + init_node_meta1(node, meta1); + init_node_meta2(node, meta2); + init_node_name(node, entries + 2, mandatory_entries - 2); + + if (!check_node(ef, node, exfat_calc_checksum(entries, n), meta1, meta2)) + return -EIO; + + return 0; +} + +static int parse_file_entry(struct exfat* ef, struct exfat_node* parent, + struct exfat_node** node, off_t* offset, int n) +{ + struct exfat_entry entries[n]; + int rc; + + rc = read_entries(ef, parent, entries, n, *offset); + if (rc != 0) + return rc; + + /* a new node has zero references */ + *node = allocate_node(); + if (*node == NULL) + return -ENOMEM; + (*node)->entry_offset = *offset; + + rc = parse_file_entries(ef, *node, entries, n); + if (rc != 0) + { + free(*node); + return rc; + } + + *offset += sizeof(struct exfat_entry[n]); + return 0; +} + +static void decompress_upcase(uint16_t* output, const le16_t* source, + size_t size) +{ + size_t si; + size_t oi; + + for (oi = 0; oi < EXFAT_UPCASE_CHARS; oi++) + output[oi] = oi; + + for (si = 0, oi = 0; si < size && oi < EXFAT_UPCASE_CHARS; si++) + { + uint16_t ch = le16_to_cpu(source[si]); + + if (ch == 0xffff && si + 1 < size) /* indicates a run */ + oi += le16_to_cpu(source[++si]); + else + output[oi++] = ch; + } +} + +/* + * Read one entry in a directory at offset position and build a new node + * structure. + */ +static int readdir(struct exfat* ef, struct exfat_node* parent, + struct exfat_node** node, off_t* offset) +{ + int rc; + struct exfat_entry entry; + const struct exfat_entry_meta1* meta1; + const struct exfat_entry_upcase* upcase; + const struct exfat_entry_bitmap* bitmap; + const struct exfat_entry_label* label; + uint64_t upcase_size = 0; + le16_t* upcase_comp = NULL; + + for (;;) + { + rc = read_entries(ef, parent, &entry, 1, *offset); + if (rc != 0) + return rc; + + switch (entry.type) + { + case EXFAT_ENTRY_FILE: + meta1 = (const struct exfat_entry_meta1*) &entry; + return parse_file_entry(ef, parent, node, offset, + 1 + meta1->continuations); + + case EXFAT_ENTRY_UPCASE: + if (ef->upcase != NULL) + break; + upcase = (const struct exfat_entry_upcase*) &entry; + if (CLUSTER_INVALID(*ef->sb, le32_to_cpu(upcase->start_cluster))) + { + exfat_error("invalid cluster 0x%x in upcase table", + le32_to_cpu(upcase->start_cluster)); + return -EIO; + } + upcase_size = le64_to_cpu(upcase->size); + if (upcase_size == 0 || + upcase_size > EXFAT_UPCASE_CHARS * sizeof(uint16_t) || + upcase_size % sizeof(uint16_t) != 0) + { + exfat_error("bad upcase table size (%"PRIu64" bytes)", + upcase_size); + return -EIO; + } + upcase_comp = malloc(upcase_size); + if (upcase_comp == NULL) + { + exfat_error("failed to allocate upcase table (%"PRIu64" bytes)", + upcase_size); + return -ENOMEM; + } + + /* read compressed upcase table */ + if (exfat_pread(ef->dev, upcase_comp, upcase_size, + exfat_c2o(ef, le32_to_cpu(upcase->start_cluster))) < 0) + { + free(upcase_comp); + exfat_error("failed to read upper case table " + "(%"PRIu64" bytes starting at cluster %#x)", + upcase_size, + le32_to_cpu(upcase->start_cluster)); + return -EIO; + } + + /* decompress upcase table */ + ef->upcase = calloc(EXFAT_UPCASE_CHARS, sizeof(uint16_t)); + if (ef->upcase == NULL) + { + free(upcase_comp); + exfat_error("failed to allocate decompressed upcase table"); + return -ENOMEM; + } + decompress_upcase(ef->upcase, upcase_comp, + upcase_size / sizeof(uint16_t)); + free(upcase_comp); + break; + + case EXFAT_ENTRY_BITMAP: + bitmap = (const struct exfat_entry_bitmap*) &entry; + ef->cmap.start_cluster = le32_to_cpu(bitmap->start_cluster); + if (CLUSTER_INVALID(*ef->sb, ef->cmap.start_cluster)) + { + exfat_error("invalid cluster 0x%x in clusters bitmap", + ef->cmap.start_cluster); + return -EIO; + } + ef->cmap.size = le32_to_cpu(ef->sb->cluster_count); + if (le64_to_cpu(bitmap->size) < DIV_ROUND_UP(ef->cmap.size, 8)) + { + exfat_error("invalid clusters bitmap size: %"PRIu64 + " (expected at least %u)", + le64_to_cpu(bitmap->size), + DIV_ROUND_UP(ef->cmap.size, 8)); + return -EIO; + } + /* FIXME bitmap can be rather big, up to 512 MB */ + ef->cmap.chunk_size = ef->cmap.size; + ef->cmap.chunk = malloc(BMAP_SIZE(ef->cmap.chunk_size)); + if (ef->cmap.chunk == NULL) + { + exfat_error("failed to allocate clusters bitmap chunk " + "(%"PRIu64" bytes)", le64_to_cpu(bitmap->size)); + return -ENOMEM; + } + + if (exfat_pread(ef->dev, ef->cmap.chunk, + BMAP_SIZE(ef->cmap.chunk_size), + exfat_c2o(ef, ef->cmap.start_cluster)) < 0) + { + exfat_error("failed to read clusters bitmap " + "(%"PRIu64" bytes starting at cluster %#x)", + le64_to_cpu(bitmap->size), ef->cmap.start_cluster); + return -EIO; + } + break; + + case EXFAT_ENTRY_LABEL: + label = (const struct exfat_entry_label*) &entry; + if (label->length > EXFAT_ENAME_MAX) + { + exfat_error("too long label (%hhu chars)", label->length); + return -EIO; + } + if (utf16_to_utf8(ef->label, label->name, + sizeof(ef->label), EXFAT_ENAME_MAX) != 0) + return -EIO; + break; + + default: + if (!(entry.type & EXFAT_ENTRY_VALID)) + break; /* deleted entry, ignore it */ + + exfat_error("unknown entry type %#hhx", entry.type); + if (!EXFAT_REPAIR(unknown_entry, ef, parent, &entry, *offset)) + return -EIO; + } + *offset += sizeof(entry); + } + /* we never reach here */ +} + +int exfat_cache_directory(struct exfat* ef, struct exfat_node* dir) +{ + off_t offset = 0; + int rc; + struct exfat_node* node; + struct exfat_node* current = NULL; + + if (dir->is_cached) + return 0; /* already cached */ + + while ((rc = readdir(ef, dir, &node, &offset)) == 0) + { + node->parent = dir; + if (current != NULL) + { + current->next = node; + node->prev = current; + } + else + dir->child = node; + + current = node; + } + + if (rc != -ENOENT) + { + /* rollback */ + for (current = dir->child; current; current = node) + { + node = current->next; + free(current); + } + dir->child = NULL; + return rc; + } + + dir->is_cached = true; + return 0; +} + +static void tree_attach(struct exfat_node* dir, struct exfat_node* node) +{ + node->parent = dir; + if (dir->child) + { + dir->child->prev = node; + node->next = dir->child; + } + dir->child = node; +} + +static void tree_detach(struct exfat_node* node) +{ + if (node->prev) + node->prev->next = node->next; + else /* this is the first node in the list */ + node->parent->child = node->next; + if (node->next) + node->next->prev = node->prev; + node->parent = NULL; + node->prev = NULL; + node->next = NULL; +} + +static void reset_cache(struct exfat* ef, struct exfat_node* node) +{ + char buffer[EXFAT_UTF8_NAME_BUFFER_MAX]; + + while (node->child) + { + struct exfat_node* p = node->child; + reset_cache(ef, p); + tree_detach(p); + free(p); + } + node->is_cached = false; + if (node->references != 0) + { + exfat_get_name(node, buffer); + exfat_warn("non-zero reference counter (%d) for '%s'", + node->references, buffer); + } + if (node != ef->root && node->is_dirty) + { + exfat_get_name(node, buffer); + exfat_bug("node '%s' is dirty", buffer); + } + while (node->references) + exfat_put_node(ef, node); +} + +void exfat_reset_cache(struct exfat* ef) +{ + reset_cache(ef, ef->root); +} + +int exfat_flush_node(struct exfat* ef, struct exfat_node* node) +{ + struct exfat_entry entries[1 + node->continuations]; + struct exfat_entry_meta1* meta1 = (struct exfat_entry_meta1*) &entries[0]; + struct exfat_entry_meta2* meta2 = (struct exfat_entry_meta2*) &entries[1]; + int rc; + + if (!node->is_dirty) + return 0; /* no need to flush */ + + if (ef->ro) + exfat_bug("unable to flush node to read-only FS"); + + if (node->parent == NULL) + return 0; /* do not flush unlinked node */ + + rc = read_entries(ef, node->parent, entries, 1 + node->continuations, + node->entry_offset); + if (rc != 0) + return rc; + if (!check_entries(entries, 1 + node->continuations)) + return -EIO; + + meta1->attrib = cpu_to_le16(node->attrib); + exfat_unix2exfat(node->mtime, &meta1->mdate, &meta1->mtime, + &meta1->mtime_cs); + exfat_unix2exfat(node->atime, &meta1->adate, &meta1->atime, NULL); + meta2->size = meta2->valid_size = cpu_to_le64(node->size); + meta2->start_cluster = cpu_to_le32(node->start_cluster); + meta2->flags = EXFAT_FLAG_ALWAYS1; + /* empty files must not be marked as contiguous */ + if (node->size != 0 && node->is_contiguous) + meta2->flags |= EXFAT_FLAG_CONTIGUOUS; + /* name hash remains unchanged, no need to recalculate it */ + + meta1->checksum = exfat_calc_checksum(entries, 1 + node->continuations); + rc = write_entries(ef, node->parent, entries, 1 + node->continuations, + node->entry_offset); + if (rc != 0) + return rc; + + node->is_dirty = false; + return exfat_flush(ef); +} + +static int erase_entries(struct exfat* ef, struct exfat_node* dir, int n, + off_t offset) +{ + struct exfat_entry entries[n]; + int rc; + int i; + + rc = read_entries(ef, dir, entries, n, offset); + if (rc != 0) + return rc; + for (i = 0; i < n; i++) + entries[i].type &= ~EXFAT_ENTRY_VALID; + return write_entries(ef, dir, entries, n, offset); +} + +static int erase_node(struct exfat* ef, struct exfat_node* node) +{ + int rc; + + exfat_get_node(node->parent); + rc = erase_entries(ef, node->parent, 1 + node->continuations, + node->entry_offset); + if (rc != 0) + { + exfat_put_node(ef, node->parent); + return rc; + } + rc = exfat_flush_node(ef, node->parent); + exfat_put_node(ef, node->parent); + return rc; +} + +static int shrink_directory(struct exfat* ef, struct exfat_node* dir, + off_t deleted_offset) +{ + const struct exfat_node* node; + const struct exfat_node* last_node; + uint64_t entries = 0; + uint64_t new_size; + + if (!(dir->attrib & EXFAT_ATTRIB_DIR)) + exfat_bug("attempted to shrink a file"); + if (!dir->is_cached) + exfat_bug("attempted to shrink uncached directory"); + + for (last_node = node = dir->child; node; node = node->next) + { + if (deleted_offset < node->entry_offset) + { + /* there are other entries after the removed one, no way to shrink + this directory */ + return 0; + } + if (last_node->entry_offset < node->entry_offset) + last_node = node; + } + + if (last_node) + { + /* offset of the last entry */ + entries += last_node->entry_offset / sizeof(struct exfat_entry); + /* two subentries with meta info */ + entries += 2; + /* subentries with file name */ + entries += DIV_ROUND_UP(utf16_length(last_node->name), + EXFAT_ENAME_MAX); + } + + new_size = DIV_ROUND_UP(entries * sizeof(struct exfat_entry), + CLUSTER_SIZE(*ef->sb)) * CLUSTER_SIZE(*ef->sb); + if (new_size == 0) /* directory always has at least 1 cluster */ + new_size = CLUSTER_SIZE(*ef->sb); + if (new_size == dir->size) + return 0; + return exfat_truncate(ef, dir, new_size, true); +} + +static int delete(struct exfat* ef, struct exfat_node* node) +{ + struct exfat_node* parent = node->parent; + off_t deleted_offset = node->entry_offset; + int rc; + + exfat_get_node(parent); + rc = erase_node(ef, node); + if (rc != 0) + { + exfat_put_node(ef, parent); + return rc; + } + tree_detach(node); + rc = shrink_directory(ef, parent, deleted_offset); + node->is_unlinked = true; + if (rc != 0) + { + exfat_flush_node(ef, parent); + exfat_put_node(ef, parent); + return rc; + } + exfat_update_mtime(parent); + rc = exfat_flush_node(ef, parent); + exfat_put_node(ef, parent); + return rc; +} + +int exfat_unlink(struct exfat* ef, struct exfat_node* node) +{ + if (node->attrib & EXFAT_ATTRIB_DIR) + return -EISDIR; + return delete(ef, node); +} + +int exfat_rmdir(struct exfat* ef, struct exfat_node* node) +{ + int rc; + + if (!(node->attrib & EXFAT_ATTRIB_DIR)) + return -ENOTDIR; + /* check that directory is empty */ + rc = exfat_cache_directory(ef, node); + if (rc != 0) + return rc; + if (node->child) + return -ENOTEMPTY; + return delete(ef, node); +} + +static int check_slot(struct exfat* ef, struct exfat_node* dir, off_t offset, + int n) +{ + struct exfat_entry entries[n]; + int rc; + size_t i; + + /* Root directory contains entries, that don't have any nodes associated + with them (clusters bitmap, upper case table, label). We need to be + careful not to overwrite them. */ + if (dir != ef->root) + return 0; + + rc = read_entries(ef, dir, entries, n, offset); + if (rc != 0) + return rc; + for (i = 0; i < n; i++) + if (entries[i].type & EXFAT_ENTRY_VALID) + return -EINVAL; + return 0; +} + +static int find_slot(struct exfat* ef, struct exfat_node* dir, + off_t* offset, int n) +{ + bitmap_t* dmap; + struct exfat_node* p; + size_t i; + int contiguous = 0; + + if (!dir->is_cached) + exfat_bug("directory is not cached"); + + /* build a bitmap of valid entries in the directory */ + dmap = calloc(BMAP_SIZE(dir->size / sizeof(struct exfat_entry)), + sizeof(bitmap_t)); + if (dmap == NULL) + { + exfat_error("failed to allocate directory bitmap (%"PRIu64")", + dir->size / sizeof(struct exfat_entry)); + return -ENOMEM; + } + for (p = dir->child; p != NULL; p = p->next) + for (i = 0; i < 1 + p->continuations; i++) + BMAP_SET(dmap, p->entry_offset / sizeof(struct exfat_entry) + i); + + /* find a slot in the directory entries bitmap */ + for (i = 0; i < dir->size / sizeof(struct exfat_entry); i++) + { + if (BMAP_GET(dmap, i) == 0) + { + if (contiguous++ == 0) + *offset = (off_t) i * sizeof(struct exfat_entry); + if (contiguous == n) + /* suitable slot is found, check that it's not occupied */ + switch (check_slot(ef, dir, *offset, n)) + { + case 0: + free(dmap); + return 0; + case -EIO: + free(dmap); + return -EIO; + case -EINVAL: + /* slot at (i-n) is occupied, go back and check (i-n+1) */ + i -= contiguous - 1; + contiguous = 0; + break; + } + } + else + contiguous = 0; + } + free(dmap); + + /* no suitable slots found, extend the directory */ + if (contiguous == 0) + *offset = dir->size; + return exfat_truncate(ef, dir, + ROUND_UP(dir->size + sizeof(struct exfat_entry[n - contiguous]), + CLUSTER_SIZE(*ef->sb)), + true); +} + +static int commit_entry(struct exfat* ef, struct exfat_node* dir, + const le16_t* name, off_t offset, uint16_t attrib) +{ + struct exfat_node* node; + const size_t name_length = utf16_length(name); + const int name_entries = DIV_ROUND_UP(name_length, EXFAT_ENAME_MAX); + struct exfat_entry entries[2 + name_entries]; + struct exfat_entry_meta1* meta1 = (struct exfat_entry_meta1*) &entries[0]; + struct exfat_entry_meta2* meta2 = (struct exfat_entry_meta2*) &entries[1]; + int i; + int rc; + + memset(entries, 0, sizeof(struct exfat_entry[2])); + + meta1->type = EXFAT_ENTRY_FILE; + meta1->continuations = 1 + name_entries; + meta1->attrib = cpu_to_le16(attrib); + exfat_unix2exfat(time(NULL), &meta1->crdate, &meta1->crtime, + &meta1->crtime_cs); + meta1->adate = meta1->mdate = meta1->crdate; + meta1->atime = meta1->mtime = meta1->crtime; + meta1->mtime_cs = meta1->crtime_cs; /* there is no atime_cs */ + + meta2->type = EXFAT_ENTRY_FILE_INFO; + meta2->flags = EXFAT_FLAG_ALWAYS1; + meta2->name_length = name_length; + meta2->name_hash = exfat_calc_name_hash(ef, name, name_length); + meta2->start_cluster = cpu_to_le32(EXFAT_CLUSTER_FREE); + + for (i = 0; i < name_entries; i++) + { + struct exfat_entry_name* name_entry; + + name_entry = (struct exfat_entry_name*) &entries[2 + i]; + name_entry->type = EXFAT_ENTRY_FILE_NAME; + name_entry->__unknown = 0; + memcpy(name_entry->name, name + i * EXFAT_ENAME_MAX, + EXFAT_ENAME_MAX * sizeof(le16_t)); + } + + meta1->checksum = exfat_calc_checksum(entries, 2 + name_entries); + rc = write_entries(ef, dir, entries, 2 + name_entries, offset); + if (rc != 0) + return rc; + + node = allocate_node(); + if (node == NULL) + return -ENOMEM; + node->entry_offset = offset; + memcpy(node->name, name, name_length * sizeof(le16_t)); + init_node_meta1(node, meta1); + init_node_meta2(node, meta2); + + tree_attach(dir, node); + return 0; +} + +static int create(struct exfat* ef, const char* path, uint16_t attrib) +{ + struct exfat_node* dir; + struct exfat_node* existing; + off_t offset = -1; + le16_t name[EXFAT_NAME_MAX + 1]; + int rc; + + rc = exfat_split(ef, &dir, &existing, name, path); + if (rc != 0) + return rc; + if (existing != NULL) + { + exfat_put_node(ef, existing); + exfat_put_node(ef, dir); + return -EEXIST; + } + + rc = find_slot(ef, dir, &offset, + 2 + DIV_ROUND_UP(utf16_length(name), EXFAT_ENAME_MAX)); + if (rc != 0) + { + exfat_put_node(ef, dir); + return rc; + } + rc = commit_entry(ef, dir, name, offset, attrib); + if (rc != 0) + { + exfat_put_node(ef, dir); + return rc; + } + exfat_update_mtime(dir); + rc = exfat_flush_node(ef, dir); + exfat_put_node(ef, dir); + return rc; +} + +int exfat_mknod(struct exfat* ef, const char* path) +{ + return create(ef, path, EXFAT_ATTRIB_ARCH); +} + +int exfat_mkdir(struct exfat* ef, const char* path) +{ + int rc; + struct exfat_node* node; + + rc = create(ef, path, EXFAT_ATTRIB_DIR); + if (rc != 0) + return rc; + rc = exfat_lookup(ef, &node, path); + if (rc != 0) + return 0; + /* directories always have at least one cluster */ + rc = exfat_truncate(ef, node, CLUSTER_SIZE(*ef->sb), true); + if (rc != 0) + { + delete(ef, node); + exfat_put_node(ef, node); + return rc; + } + rc = exfat_flush_node(ef, node); + if (rc != 0) + { + delete(ef, node); + exfat_put_node(ef, node); + return rc; + } + exfat_put_node(ef, node); + return 0; +} + +static int rename_entry(struct exfat* ef, struct exfat_node* dir, + struct exfat_node* node, const le16_t* name, off_t new_offset) +{ + const size_t name_length = utf16_length(name); + const int name_entries = DIV_ROUND_UP(name_length, EXFAT_ENAME_MAX); + struct exfat_entry entries[2 + name_entries]; + struct exfat_entry_meta1* meta1 = (struct exfat_entry_meta1*) &entries[0]; + struct exfat_entry_meta2* meta2 = (struct exfat_entry_meta2*) &entries[1]; + int rc; + int i; + + rc = read_entries(ef, node->parent, entries, 2, node->entry_offset); + if (rc != 0) + return rc; + + meta1->continuations = 1 + name_entries; + meta2->name_length = name_length; + meta2->name_hash = exfat_calc_name_hash(ef, name, name_length); + + rc = erase_node(ef, node); + if (rc != 0) + return rc; + + node->entry_offset = new_offset; + node->continuations = 1 + name_entries; + + for (i = 0; i < name_entries; i++) + { + struct exfat_entry_name* name_entry; + + name_entry = (struct exfat_entry_name*) &entries[2 + i]; + name_entry->type = EXFAT_ENTRY_FILE_NAME; + name_entry->__unknown = 0; + memcpy(name_entry->name, name + i * EXFAT_ENAME_MAX, + EXFAT_ENAME_MAX * sizeof(le16_t)); + } + + meta1->checksum = exfat_calc_checksum(entries, 2 + name_entries); + rc = write_entries(ef, dir, entries, 2 + name_entries, new_offset); + if (rc != 0) + return rc; + + memcpy(node->name, name, (EXFAT_NAME_MAX + 1) * sizeof(le16_t)); + tree_detach(node); + tree_attach(dir, node); + return 0; +} + +int exfat_rename(struct exfat* ef, const char* old_path, const char* new_path) +{ + struct exfat_node* node; + struct exfat_node* existing; + struct exfat_node* dir; + off_t offset = -1; + le16_t name[EXFAT_NAME_MAX + 1]; + int rc; + + rc = exfat_lookup(ef, &node, old_path); + if (rc != 0) + return rc; + + rc = exfat_split(ef, &dir, &existing, name, new_path); + if (rc != 0) + { + exfat_put_node(ef, node); + return rc; + } + + /* check that target is not a subdirectory of the source */ + if (node->attrib & EXFAT_ATTRIB_DIR) + { + struct exfat_node* p; + + for (p = dir; p; p = p->parent) + if (node == p) + { + if (existing != NULL) + exfat_put_node(ef, existing); + exfat_put_node(ef, dir); + exfat_put_node(ef, node); + return -EINVAL; + } + } + + if (existing != NULL) + { + /* remove target if it's not the same node as source */ + if (existing != node) + { + if (existing->attrib & EXFAT_ATTRIB_DIR) + { + if (node->attrib & EXFAT_ATTRIB_DIR) + rc = exfat_rmdir(ef, existing); + else + rc = -ENOTDIR; + } + else + { + if (!(node->attrib & EXFAT_ATTRIB_DIR)) + rc = exfat_unlink(ef, existing); + else + rc = -EISDIR; + } + exfat_put_node(ef, existing); + if (rc != 0) + { + /* free clusters even if something went wrong; overwise they + will be just lost */ + exfat_cleanup_node(ef, existing); + exfat_put_node(ef, dir); + exfat_put_node(ef, node); + return rc; + } + rc = exfat_cleanup_node(ef, existing); + if (rc != 0) + { + exfat_put_node(ef, dir); + exfat_put_node(ef, node); + return rc; + } + } + else + exfat_put_node(ef, existing); + } + + rc = find_slot(ef, dir, &offset, + 2 + DIV_ROUND_UP(utf16_length(name), EXFAT_ENAME_MAX)); + if (rc != 0) + { + exfat_put_node(ef, dir); + exfat_put_node(ef, node); + return rc; + } + rc = rename_entry(ef, dir, node, name, offset); + if (rc != 0) + { + exfat_put_node(ef, dir); + exfat_put_node(ef, node); + return rc; + } + rc = exfat_flush_node(ef, dir); + exfat_put_node(ef, dir); + exfat_put_node(ef, node); + /* node itself is not marked as dirty, no need to flush it */ + return rc; +} + +void exfat_utimes(struct exfat_node* node, const struct timespec tv[2]) +{ + node->atime = tv[0].tv_sec; + node->mtime = tv[1].tv_sec; + node->is_dirty = true; +} + +void exfat_update_atime(struct exfat_node* node) +{ + node->atime = time(NULL); + node->is_dirty = true; +} + +void exfat_update_mtime(struct exfat_node* node) +{ + node->mtime = time(NULL); + node->is_dirty = true; +} + +const char* exfat_get_label(struct exfat* ef) +{ + return ef->label; +} + +static int find_label(struct exfat* ef, off_t* offset) +{ + struct exfat_entry entry; + int rc; + + for (*offset = 0; ; *offset += sizeof(entry)) + { + rc = read_entries(ef, ef->root, &entry, 1, *offset); + if (rc != 0) + return rc; + + if (entry.type == EXFAT_ENTRY_LABEL) + return 0; + } +} + +int exfat_set_label(struct exfat* ef, const char* label) +{ + le16_t label_utf16[EXFAT_ENAME_MAX + 1]; + int rc; + off_t offset; + struct exfat_entry_label entry; + + memset(label_utf16, 0, sizeof(label_utf16)); + rc = utf8_to_utf16(label_utf16, label, EXFAT_ENAME_MAX + 1, strlen(label)); + if (rc != 0) + return rc; + + rc = find_label(ef, &offset); + if (rc == -ENOENT) + rc = find_slot(ef, ef->root, &offset, 1); + if (rc != 0) + return rc; + + entry.type = EXFAT_ENTRY_LABEL; + entry.length = utf16_length(label_utf16); + memcpy(entry.name, label_utf16, sizeof(entry.name)); + if (entry.length == 0) + entry.type ^= EXFAT_ENTRY_VALID; + + rc = write_entries(ef, ef->root, (struct exfat_entry*) &entry, 1, offset); + if (rc != 0) + return rc; + + strcpy(ef->label, label); + return 0; +} diff --git a/src/gui/Lib/exfat/src/libexfat/platform.h b/src/gui/Lib/exfat/src/libexfat/platform.h new file mode 100644 index 0000000..9ab3155 --- /dev/null +++ b/src/gui/Lib/exfat/src/libexfat/platform.h @@ -0,0 +1,63 @@ +/* + platform.h (14.05.13) + OS-specific code (libc-specific in fact). Note that systems with the + same kernel can use different libc implementations. + + Free exFAT implementation. + Copyright (C) 2010-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef PLATFORM_H_INCLUDED +#define PLATFORM_H_INCLUDED + +#if defined(__linux__) || defined(__GLIBC__) || defined(__GNU__) + +#include +#include +#define exfat_bswap16(x) bswap_16(x) +#define exfat_bswap32(x) bswap_32(x) +#define exfat_bswap64(x) bswap_64(x) +#define EXFAT_BYTE_ORDER __BYTE_ORDER +#define EXFAT_LITTLE_ENDIAN __LITTLE_ENDIAN +#define EXFAT_BIG_ENDIAN __BIG_ENDIAN + +#elif defined(__APPLE__) + +#include +#include +#define exfat_bswap16(x) OSSwapInt16(x) +#define exfat_bswap32(x) OSSwapInt32(x) +#define exfat_bswap64(x) OSSwapInt64(x) +#define EXFAT_BYTE_ORDER BYTE_ORDER +#define EXFAT_LITTLE_ENDIAN LITTLE_ENDIAN +#define EXFAT_BIG_ENDIAN BIG_ENDIAN + +#elif defined(__FreeBSD__) || defined(__DragonFly__) || defined(__NetBSD__) || defined(__OpenBSD__) + +#include +#define exfat_bswap16(x) bswap16(x) +#define exfat_bswap32(x) bswap32(x) +#define exfat_bswap64(x) bswap64(x) +#define EXFAT_BYTE_ORDER _BYTE_ORDER +#define EXFAT_LITTLE_ENDIAN _LITTLE_ENDIAN +#define EXFAT_BIG_ENDIAN _BIG_ENDIAN + +#else +#error Unknown platform +#endif + +#endif /* ifndef PLATFORM_H_INCLUDED */ diff --git a/src/gui/Lib/exfat/src/libexfat/repair.c b/src/gui/Lib/exfat/src/libexfat/repair.c new file mode 100644 index 0000000..620ad52 --- /dev/null +++ b/src/gui/Lib/exfat/src/libexfat/repair.c @@ -0,0 +1,103 @@ +/* + repair.c (09.03.17) + exFAT file system implementation library. + + Free exFAT implementation. + Copyright (C) 2010-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "exfat.h" +#include + +int exfat_errors_fixed; + +bool exfat_ask_to_fix(const struct exfat* ef) +{ + const char* question = "Fix (Y/N)?"; + char answer[8]; + bool yeah, nope; + + switch (ef->repair) + { + case EXFAT_REPAIR_NO: + return false; + case EXFAT_REPAIR_YES: + printf("%s %s", question, "Y\n"); + return true; + case EXFAT_REPAIR_ASK: + do + { + printf("%s ", question); + fflush(stdout); + if (fgets(answer, sizeof(answer), stdin)) + { + yeah = strcasecmp(answer, "Y\n") == 0; + nope = strcasecmp(answer, "N\n") == 0; + } + else + { + yeah = false; + nope = true; + } + } + while (!yeah && !nope); + return yeah; + } + exfat_bug("invalid repair option value: %d", ef->repair); + return false; +} + +bool exfat_fix_invalid_vbr_checksum(const struct exfat* ef, void* sector, + uint32_t vbr_checksum) +{ + size_t i; + off_t sector_size = SECTOR_SIZE(*ef->sb); + + for (i = 0; i < sector_size / sizeof(vbr_checksum); i++) + ((le32_t*) sector)[i] = cpu_to_le32(vbr_checksum); + if (exfat_pwrite(ef->dev, sector, sector_size, 11 * sector_size) < 0) + { + exfat_error("failed to write correct VBR checksum"); + return false; + } + exfat_errors_fixed++; + return true; +} + +bool exfat_fix_invalid_node_checksum(const struct exfat* ef, + struct exfat_node* node) +{ + /* checksum will be rewritten by exfat_flush_node() */ + node->is_dirty = true; + + exfat_errors_fixed++; + return true; +} + +bool exfat_fix_unknown_entry(struct exfat* ef, struct exfat_node* dir, + const struct exfat_entry* entry, off_t offset) +{ + struct exfat_entry deleted = *entry; + + deleted.type &= ~EXFAT_ENTRY_VALID; + if (exfat_generic_pwrite(ef, dir, &deleted, sizeof(struct exfat_entry), + offset) != sizeof(struct exfat_entry)) + return false; + + exfat_errors_fixed++; + return true; +} diff --git a/src/gui/Lib/exfat/src/libexfat/time.c b/src/gui/Lib/exfat/src/libexfat/time.c new file mode 100644 index 0000000..31ae5a2 --- /dev/null +++ b/src/gui/Lib/exfat/src/libexfat/time.c @@ -0,0 +1,164 @@ +/* + time.c (03.02.12) + exFAT file system implementation library. + + Free exFAT implementation. + Copyright (C) 2010-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "exfat.h" + +/* timezone offset from UTC in seconds; positive for western timezones, + negative for eastern ones */ +static long exfat_timezone; + +#define SEC_IN_MIN 60ll +#define SEC_IN_HOUR (60 * SEC_IN_MIN) +#define SEC_IN_DAY (24 * SEC_IN_HOUR) +#define SEC_IN_YEAR (365 * SEC_IN_DAY) /* not leap year */ +/* Unix epoch started at 0:00:00 UTC 1 January 1970 */ +#define UNIX_EPOCH_YEAR 1970 +/* exFAT epoch started at 0:00:00 UTC 1 January 1980 */ +#define EXFAT_EPOCH_YEAR 1980 +/* number of years from Unix epoch to exFAT epoch */ +#define EPOCH_DIFF_YEAR (EXFAT_EPOCH_YEAR - UNIX_EPOCH_YEAR) +/* number of days from Unix epoch to exFAT epoch (considering leap days) */ +#define EPOCH_DIFF_DAYS (EPOCH_DIFF_YEAR * 365 + EPOCH_DIFF_YEAR / 4) +/* number of seconds from Unix epoch to exFAT epoch (considering leap days) */ +#define EPOCH_DIFF_SEC (EPOCH_DIFF_DAYS * SEC_IN_DAY) +/* number of leap years passed from exFAT epoch to the specified year + (excluding the specified year itself) */ +#define LEAP_YEARS(year) ((EXFAT_EPOCH_YEAR + (year) - 1) / 4 \ + - (EXFAT_EPOCH_YEAR - 1) / 4) +/* checks whether the specified year is leap */ +#define IS_LEAP_YEAR(year) ((EXFAT_EPOCH_YEAR + (year)) % 4 == 0) + +static const time_t days_in_year[] = +{ + /* Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec */ + 0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 +}; + +time_t exfat_exfat2unix(le16_t date, le16_t time, uint8_t centisec) +{ + time_t unix_time = EPOCH_DIFF_SEC; + uint16_t ndate = le16_to_cpu(date); + uint16_t ntime = le16_to_cpu(time); + + uint16_t day = ndate & 0x1f; /* 5 bits, 1-31 */ + uint16_t month = ndate >> 5 & 0xf; /* 4 bits, 1-12 */ + uint16_t year = ndate >> 9; /* 7 bits, 1-127 (+1980) */ + + uint16_t twosec = ntime & 0x1f; /* 5 bits, 0-29 (2 sec granularity) */ + uint16_t min = ntime >> 5 & 0x3f; /* 6 bits, 0-59 */ + uint16_t hour = ntime >> 11; /* 5 bits, 0-23 */ + + if (day == 0 || month == 0 || month > 12) + { + exfat_error("bad date %u-%02hu-%02hu", + year + EXFAT_EPOCH_YEAR, month, day); + return 0; + } + if (hour > 23 || min > 59 || twosec > 29) + { + exfat_error("bad time %hu:%02hu:%02u", + hour, min, twosec * 2); + return 0; + } + if (centisec > 199) + { + exfat_error("bad centiseconds count %hhu", centisec); + return 0; + } + + /* every 4th year between 1904 and 2096 is leap */ + unix_time += year * SEC_IN_YEAR + LEAP_YEARS(year) * SEC_IN_DAY; + unix_time += days_in_year[month] * SEC_IN_DAY; + /* if it's leap year and February has passed we should add 1 day */ + if ((EXFAT_EPOCH_YEAR + year) % 4 == 0 && month > 2) + unix_time += SEC_IN_DAY; + unix_time += (day - 1) * SEC_IN_DAY; + + unix_time += hour * SEC_IN_HOUR; + unix_time += min * SEC_IN_MIN; + /* exFAT represents time with 2 sec granularity */ + unix_time += twosec * 2; + unix_time += centisec / 100; + + /* exFAT stores timestamps in local time, so we correct it to UTC */ + unix_time += exfat_timezone; + + return unix_time; +} + +void exfat_unix2exfat(time_t unix_time, le16_t* date, le16_t* time, + uint8_t* centisec) +{ + time_t shift = EPOCH_DIFF_SEC + exfat_timezone; + uint16_t day, month, year; + uint16_t twosec, min, hour; + int days; + int i; + + /* time before exFAT epoch cannot be represented */ + if (unix_time < shift) + unix_time = shift; + + unix_time -= shift; + + days = unix_time / SEC_IN_DAY; + year = (4 * days) / (4 * 365 + 1); + days -= year * 365 + LEAP_YEARS(year); + month = 0; + for (i = 1; i <= 12; i++) + { + int leap_day = (IS_LEAP_YEAR(year) && i == 2); + int leap_sub = (IS_LEAP_YEAR(year) && i >= 3); + + if (i == 12 || days - leap_sub < days_in_year[i + 1] + leap_day) + { + month = i; + days -= days_in_year[i] + leap_sub; + break; + } + } + day = days + 1; + + hour = (unix_time % SEC_IN_DAY) / SEC_IN_HOUR; + min = (unix_time % SEC_IN_HOUR) / SEC_IN_MIN; + twosec = (unix_time % SEC_IN_MIN) / 2; + + *date = cpu_to_le16(day | (month << 5) | (year << 9)); + *time = cpu_to_le16(twosec | (min << 5) | (hour << 11)); + if (centisec) + *centisec = (unix_time % 2) * 100; +} + +void exfat_tzset(void) +{ + time_t now; + struct tm* utc; + + tzset(); + now = time(NULL); + utc = gmtime(&now); + /* gmtime() always sets tm_isdst to 0 because daylight savings never + affect UTC. Setting tm_isdst to -1 makes mktime() to determine whether + summer time is in effect. */ + utc->tm_isdst = -1; + exfat_timezone = mktime(utc) - now; +} diff --git a/src/gui/Lib/exfat/src/libexfat/utf.c b/src/gui/Lib/exfat/src/libexfat/utf.c new file mode 100644 index 0000000..0d0018c --- /dev/null +++ b/src/gui/Lib/exfat/src/libexfat/utf.c @@ -0,0 +1,245 @@ +/* + utf.c (13.09.09) + exFAT file system implementation library. + + Free exFAT implementation. + Copyright (C) 2010-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "exfat.h" +#include + +static char* wchar_to_utf8(char* output, wchar_t wc, size_t outsize) +{ + if (wc <= 0x7f) + { + if (outsize < 1) + return NULL; + *output++ = (char) wc; + } + else if (wc <= 0x7ff) + { + if (outsize < 2) + return NULL; + *output++ = 0xc0 | (wc >> 6); + *output++ = 0x80 | (wc & 0x3f); + } + else if (wc <= 0xffff) + { + if (outsize < 3) + return NULL; + *output++ = 0xe0 | (wc >> 12); + *output++ = 0x80 | ((wc >> 6) & 0x3f); + *output++ = 0x80 | (wc & 0x3f); + } + else if (wc <= 0x1fffff) + { + if (outsize < 4) + return NULL; + *output++ = 0xf0 | (wc >> 18); + *output++ = 0x80 | ((wc >> 12) & 0x3f); + *output++ = 0x80 | ((wc >> 6) & 0x3f); + *output++ = 0x80 | (wc & 0x3f); + } + else if (wc <= 0x3ffffff) + { + if (outsize < 5) + return NULL; + *output++ = 0xf8 | (wc >> 24); + *output++ = 0x80 | ((wc >> 18) & 0x3f); + *output++ = 0x80 | ((wc >> 12) & 0x3f); + *output++ = 0x80 | ((wc >> 6) & 0x3f); + *output++ = 0x80 | (wc & 0x3f); + } + else if (wc <= 0x7fffffff) + { + if (outsize < 6) + return NULL; + *output++ = 0xfc | (wc >> 30); + *output++ = 0x80 | ((wc >> 24) & 0x3f); + *output++ = 0x80 | ((wc >> 18) & 0x3f); + *output++ = 0x80 | ((wc >> 12) & 0x3f); + *output++ = 0x80 | ((wc >> 6) & 0x3f); + *output++ = 0x80 | (wc & 0x3f); + } + else + return NULL; + + return output; +} + +static const le16_t* utf16_to_wchar(const le16_t* input, wchar_t* wc, + size_t insize) +{ + if ((le16_to_cpu(input[0]) & 0xfc00) == 0xd800) + { + if (insize < 2 || (le16_to_cpu(input[1]) & 0xfc00) != 0xdc00) + return NULL; + *wc = ((wchar_t) (le16_to_cpu(input[0]) & 0x3ff) << 10); + *wc |= (le16_to_cpu(input[1]) & 0x3ff); + *wc += 0x10000; + return input + 2; + } + else + { + *wc = le16_to_cpu(*input); + return input + 1; + } +} + +int utf16_to_utf8(char* output, const le16_t* input, size_t outsize, + size_t insize) +{ + const le16_t* inp = input; + char* outp = output; + wchar_t wc; + + while (inp - input < insize) + { + inp = utf16_to_wchar(inp, &wc, insize - (inp - input)); + if (inp == NULL) + { + exfat_error("illegal UTF-16 sequence"); + return -EILSEQ; + } + outp = wchar_to_utf8(outp, wc, outsize - (outp - output)); + if (outp == NULL) + { + exfat_error("name is too long"); + return -ENAMETOOLONG; + } + if (wc == 0) + return 0; + } + if (outp - output >= outsize) + { + exfat_error("name is too long"); + return -ENAMETOOLONG; + } + *outp = '\0'; + return 0; +} + +static const char* utf8_to_wchar(const char* input, wchar_t* wc, + size_t insize) +{ + if ((input[0] & 0x80) == 0 && insize >= 1) + { + *wc = (wchar_t) input[0]; + return input + 1; + } + if ((input[0] & 0xe0) == 0xc0 && insize >= 2) + { + *wc = (((wchar_t) input[0] & 0x1f) << 6) | + ((wchar_t) input[1] & 0x3f); + return input + 2; + } + if ((input[0] & 0xf0) == 0xe0 && insize >= 3) + { + *wc = (((wchar_t) input[0] & 0x0f) << 12) | + (((wchar_t) input[1] & 0x3f) << 6) | + ((wchar_t) input[2] & 0x3f); + return input + 3; + } + if ((input[0] & 0xf8) == 0xf0 && insize >= 4) + { + *wc = (((wchar_t) input[0] & 0x07) << 18) | + (((wchar_t) input[1] & 0x3f) << 12) | + (((wchar_t) input[2] & 0x3f) << 6) | + ((wchar_t) input[3] & 0x3f); + return input + 4; + } + if ((input[0] & 0xfc) == 0xf8 && insize >= 5) + { + *wc = (((wchar_t) input[0] & 0x03) << 24) | + (((wchar_t) input[1] & 0x3f) << 18) | + (((wchar_t) input[2] & 0x3f) << 12) | + (((wchar_t) input[3] & 0x3f) << 6) | + ((wchar_t) input[4] & 0x3f); + return input + 5; + } + if ((input[0] & 0xfe) == 0xfc && insize >= 6) + { + *wc = (((wchar_t) input[0] & 0x01) << 30) | + (((wchar_t) input[1] & 0x3f) << 24) | + (((wchar_t) input[2] & 0x3f) << 18) | + (((wchar_t) input[3] & 0x3f) << 12) | + (((wchar_t) input[4] & 0x3f) << 6) | + ((wchar_t) input[5] & 0x3f); + return input + 6; + } + return NULL; +} + +static le16_t* wchar_to_utf16(le16_t* output, wchar_t wc, size_t outsize) +{ + if (wc <= 0xffff) /* if character is from BMP */ + { + if (outsize == 0) + return NULL; + output[0] = cpu_to_le16(wc); + return output + 1; + } + if (outsize < 2) + return NULL; + wc -= 0x10000; + output[0] = cpu_to_le16(0xd800 | ((wc >> 10) & 0x3ff)); + output[1] = cpu_to_le16(0xdc00 | (wc & 0x3ff)); + return output + 2; +} + +int utf8_to_utf16(le16_t* output, const char* input, size_t outsize, + size_t insize) +{ + const char* inp = input; + le16_t* outp = output; + wchar_t wc; + + while (inp - input < insize) + { + inp = utf8_to_wchar(inp, &wc, insize - (inp - input)); + if (inp == NULL) + { + exfat_error("illegal UTF-8 sequence"); + return -EILSEQ; + } + outp = wchar_to_utf16(outp, wc, outsize - (outp - output)); + if (outp == NULL) + { + exfat_error("name is too long"); + return -ENAMETOOLONG; + } + if (wc == 0) + break; + } + if (outp - output >= outsize) + { + exfat_error("name is too long"); + return -ENAMETOOLONG; + } + *outp = cpu_to_le16(0); + return 0; +} + +size_t utf16_length(const le16_t* str) +{ + size_t i = 0; + + while (le16_to_cpu(str[i])) + i++; + return i; +} diff --git a/src/gui/Lib/exfat/src/libexfat/utils.c b/src/gui/Lib/exfat/src/libexfat/utils.c new file mode 100644 index 0000000..7baa663 --- /dev/null +++ b/src/gui/Lib/exfat/src/libexfat/utils.c @@ -0,0 +1,180 @@ +/* + utils.c (04.09.09) + exFAT file system implementation library. + + Free exFAT implementation. + Copyright (C) 2010-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "exfat.h" +#include +#include +#include + +void exfat_stat(const struct exfat* ef, const struct exfat_node* node, + struct stat* stbuf) +{ + memset(stbuf, 0, sizeof(struct stat)); + if (node->attrib & EXFAT_ATTRIB_DIR) + stbuf->st_mode = S_IFDIR | (0777 & ~ef->dmask); + else + stbuf->st_mode = S_IFREG | (0777 & ~ef->fmask); + stbuf->st_nlink = 1; + stbuf->st_uid = ef->uid; + stbuf->st_gid = ef->gid; + stbuf->st_size = node->size; + stbuf->st_blocks = ROUND_UP(node->size, CLUSTER_SIZE(*ef->sb)) / 512; + stbuf->st_mtime = node->mtime; + stbuf->st_atime = node->atime; + /* set ctime to mtime to ensure we don't break programs that rely on ctime + (e.g. rsync) */ + stbuf->st_ctime = node->mtime; +} + +void exfat_get_name(const struct exfat_node* node, + char buffer[EXFAT_UTF8_NAME_BUFFER_MAX]) +{ + if (utf16_to_utf8(buffer, node->name, EXFAT_UTF8_NAME_BUFFER_MAX, + EXFAT_NAME_MAX) != 0) + exfat_bug("failed to convert name to UTF-8"); +} + +static uint16_t add_checksum_byte(uint16_t sum, uint8_t byte) +{ + return ((sum << 15) | (sum >> 1)) + byte; +} + +static uint16_t add_checksum_bytes(uint16_t sum, const void* buffer, size_t n) +{ + int i; + + for (i = 0; i < n; i++) + sum = add_checksum_byte(sum, ((const uint8_t*) buffer)[i]); + return sum; +} + +uint16_t exfat_start_checksum(const struct exfat_entry_meta1* entry) +{ + uint16_t sum = 0; + int i; + + for (i = 0; i < sizeof(struct exfat_entry); i++) + if (i != 2 && i != 3) /* skip checksum field itself */ + sum = add_checksum_byte(sum, ((const uint8_t*) entry)[i]); + return sum; +} + +uint16_t exfat_add_checksum(const void* entry, uint16_t sum) +{ + return add_checksum_bytes(sum, entry, sizeof(struct exfat_entry)); +} + +le16_t exfat_calc_checksum(const struct exfat_entry* entries, int n) +{ + uint16_t checksum; + int i; + + checksum = exfat_start_checksum((const struct exfat_entry_meta1*) entries); + for (i = 1; i < n; i++) + checksum = exfat_add_checksum(entries + i, checksum); + return cpu_to_le16(checksum); +} + +uint32_t exfat_vbr_start_checksum(const void* sector, size_t size) +{ + size_t i; + uint32_t sum = 0; + + for (i = 0; i < size; i++) + /* skip volume_state and allocated_percent fields */ + if (i != 0x6a && i != 0x6b && i != 0x70) + sum = ((sum << 31) | (sum >> 1)) + ((const uint8_t*) sector)[i]; + return sum; +} + +uint32_t exfat_vbr_add_checksum(const void* sector, size_t size, uint32_t sum) +{ + size_t i; + + for (i = 0; i < size; i++) + sum = ((sum << 31) | (sum >> 1)) + ((const uint8_t*) sector)[i]; + return sum; +} + +le16_t exfat_calc_name_hash(const struct exfat* ef, const le16_t* name, + size_t length) +{ + size_t i; + uint16_t hash = 0; + + for (i = 0; i < length; i++) + { + uint16_t c = le16_to_cpu(name[i]); + + /* convert to upper case */ + c = ef->upcase[c]; + + hash = ((hash << 15) | (hash >> 1)) + (c & 0xff); + hash = ((hash << 15) | (hash >> 1)) + (c >> 8); + } + return cpu_to_le16(hash); +} + +void exfat_humanize_bytes(uint64_t value, struct exfat_human_bytes* hb) +{ + size_t i; + /* 16 EB (minus 1 byte) is the largest size that can be represented by + uint64_t */ + const char* units[] = {"bytes", "KB", "MB", "GB", "TB", "PB", "EB"}; + uint64_t divisor = 1; + uint64_t temp = 0; + + for (i = 0; ; i++, divisor *= 1024) + { + temp = (value + divisor / 2) / divisor; + + if (temp == 0) + break; + if (temp / 1024 * 1024 == temp) + continue; + if (temp < 10240) + break; + } + hb->value = temp; + hb->unit = units[i]; +} + +void exfat_print_info(const struct exfat_super_block* sb, + uint32_t free_clusters) +{ + struct exfat_human_bytes hb; + off_t total_space = le64_to_cpu(sb->sector_count) * SECTOR_SIZE(*sb); + off_t avail_space = (off_t) free_clusters * CLUSTER_SIZE(*sb); + + printf("File system version %hhu.%hhu\n", + sb->version.major, sb->version.minor); + exfat_humanize_bytes(SECTOR_SIZE(*sb), &hb); + printf("Sector size %10"PRIu64" %s\n", hb.value, hb.unit); + exfat_humanize_bytes(CLUSTER_SIZE(*sb), &hb); + printf("Cluster size %10"PRIu64" %s\n", hb.value, hb.unit); + exfat_humanize_bytes(total_space, &hb); + printf("Volume size %10"PRIu64" %s\n", hb.value, hb.unit); + exfat_humanize_bytes(total_space - avail_space, &hb); + printf("Used space %10"PRIu64" %s\n", hb.value, hb.unit); + exfat_humanize_bytes(avail_space, &hb); + printf("Available space %10"PRIu64" %s\n", hb.value, hb.unit); +} diff --git a/src/gui/Lib/exfat/src/mkfs/cbm.c b/src/gui/Lib/exfat/src/mkfs/cbm.c new file mode 100644 index 0000000..ad5accc --- /dev/null +++ b/src/gui/Lib/exfat/src/mkfs/cbm.c @@ -0,0 +1,79 @@ +/* + cbm.c (09.11.10) + Clusters Bitmap creation code. + + Free exFAT implementation. + Copyright (C) 2011-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "cbm.h" +#include "fat.h" +#include "uct.h" +#include "rootdir.h" +#include +#include + +static off_t cbm_alignment(void) +{ + return get_cluster_size(); +} + +static off_t cbm_size(void) +{ + return DIV_ROUND_UP( + (get_volume_size() - get_position(&cbm)) / get_cluster_size(), + CHAR_BIT); +} + +static int cbm_write(struct exfat_dev* dev) +{ + uint32_t allocated_clusters = + DIV_ROUND_UP(cbm.get_size(), get_cluster_size()) + + DIV_ROUND_UP(uct.get_size(), get_cluster_size()) + + DIV_ROUND_UP(rootdir.get_size(), get_cluster_size()); + size_t bitmap_size = ROUND_UP(allocated_clusters, CHAR_BIT); + bitmap_t* bitmap = malloc(BMAP_SIZE(bitmap_size)); + size_t i; + + if (bitmap == NULL) + { + exfat_error("failed to allocate bitmap of %zu bytes", + BMAP_SIZE(bitmap_size)); + return 1; + } + memset(bitmap, 0, BMAP_SIZE(bitmap_size)); + + for (i = 0; i < bitmap_size; i++) + if (i < allocated_clusters) + BMAP_SET(bitmap, i); + if (exfat_write(dev, bitmap, bitmap_size / CHAR_BIT) < 0) + { + free(bitmap); + exfat_error("failed to write bitmap of %zu bytes", + bitmap_size / CHAR_BIT); + return 1; + } + free(bitmap); + return 0; +} + +const struct fs_object cbm = +{ + .get_alignment = cbm_alignment, + .get_size = cbm_size, + .write = cbm_write, +}; diff --git a/src/gui/Lib/exfat/src/mkfs/cbm.h b/src/gui/Lib/exfat/src/mkfs/cbm.h new file mode 100644 index 0000000..3803b79 --- /dev/null +++ b/src/gui/Lib/exfat/src/mkfs/cbm.h @@ -0,0 +1,30 @@ +/* + cbm.h (09.11.10) + Clusters Bitmap creation code. + + Free exFAT implementation. + Copyright (C) 2011-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef MKFS_CBM_H_INCLUDED +#define MKFS_CBM_H_INCLUDED + +#include "mkexfat.h" + +extern const struct fs_object cbm; + +#endif /* ifndef MKFS_CBM_H_INCLUDED */ diff --git a/src/gui/Lib/exfat/src/mkfs/fat.c b/src/gui/Lib/exfat/src/mkfs/fat.c new file mode 100644 index 0000000..c5174a7 --- /dev/null +++ b/src/gui/Lib/exfat/src/mkfs/fat.c @@ -0,0 +1,88 @@ +/* + fat.c (09.11.10) + File Allocation Table creation code. + + Free exFAT implementation. + Copyright (C) 2011-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "fat.h" +#include "cbm.h" +#include "uct.h" +#include "rootdir.h" +#include + +static off_t fat_alignment(void) +{ + return (off_t) 128 * get_sector_size(); +} + +static off_t fat_size(void) +{ + return get_volume_size() / get_cluster_size() * sizeof(cluster_t); +} + +static cluster_t fat_write_entry(struct exfat_dev* dev, cluster_t cluster, + cluster_t value) +{ + le32_t fat_entry = cpu_to_le32(value); + if (exfat_write(dev, &fat_entry, sizeof(fat_entry)) < 0) + { + exfat_error("failed to write FAT entry 0x%x", value); + return 0; + } + return cluster + 1; +} + +static cluster_t fat_write_entries(struct exfat_dev* dev, cluster_t cluster, + uint64_t length) +{ + cluster_t end = cluster + DIV_ROUND_UP(length, get_cluster_size()); + + while (cluster < end - 1) + { + cluster = fat_write_entry(dev, cluster, cluster + 1); + if (cluster == 0) + return 0; + } + return fat_write_entry(dev, cluster, EXFAT_CLUSTER_END); +} + +static int fat_write(struct exfat_dev* dev) +{ + cluster_t c = 0; + + if (!(c = fat_write_entry(dev, c, 0xfffffff8))) /* media type */ + return 1; + if (!(c = fat_write_entry(dev, c, 0xffffffff))) /* some weird constant */ + return 1; + if (!(c = fat_write_entries(dev, c, cbm.get_size()))) + return 1; + if (!(c = fat_write_entries(dev, c, uct.get_size()))) + return 1; + if (!(c = fat_write_entries(dev, c, rootdir.get_size()))) + return 1; + + return 0; +} + +const struct fs_object fat = +{ + .get_alignment = fat_alignment, + .get_size = fat_size, + .write = fat_write, +}; diff --git a/src/gui/Lib/exfat/src/mkfs/fat.h b/src/gui/Lib/exfat/src/mkfs/fat.h new file mode 100644 index 0000000..fbecaa2 --- /dev/null +++ b/src/gui/Lib/exfat/src/mkfs/fat.h @@ -0,0 +1,30 @@ +/* + fat.h (09.11.10) + File Allocation Table creation code. + + Free exFAT implementation. + Copyright (C) 2011-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef MKFS_FAT_H_INCLUDED +#define MKFS_FAT_H_INCLUDED + +#include "mkexfat.h" + +extern const struct fs_object fat; + +#endif /* ifndef MKFS_FAT_H_INCLUDED */ diff --git a/src/gui/Lib/exfat/src/mkfs/mkexfat.c b/src/gui/Lib/exfat/src/mkfs/mkexfat.c new file mode 100644 index 0000000..10ecf23 --- /dev/null +++ b/src/gui/Lib/exfat/src/mkfs/mkexfat.c @@ -0,0 +1,167 @@ +/* + mkexfat.c (22.04.12) + FS creation engine. + + Free exFAT implementation. + Copyright (C) 2011-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "mkexfat.h" +#include +#include +#include +#include +#include + +static int check_size(off_t volume_size) +{ + const struct fs_object** pp; + off_t position = 0; + + for (pp = objects; *pp; pp++) + { + position = ROUND_UP(position, (*pp)->get_alignment()); + position += (*pp)->get_size(); + } + + if (position > volume_size) + { + struct exfat_human_bytes vhb; + + exfat_humanize_bytes(volume_size, &vhb); + exfat_error("too small device (%"PRIu64" %s)", vhb.value, vhb.unit); + return 1; + } + + return 0; + +} + +static int erase_object(struct exfat_dev* dev, const void* block, + size_t block_size, off_t start, off_t size) +{ + const off_t block_count = DIV_ROUND_UP(size, block_size); + off_t i; + + if (exfat_seek(dev, start, SEEK_SET) == (off_t) -1) + { + exfat_error("seek to 0x%"PRIx64" failed", start); + return 1; + } + for (i = 0; i < size; i += block_size) + { + if (exfat_write(dev, block, MIN(size - i, block_size)) < 0) + { + exfat_error("failed to erase block %"PRIu64"/%"PRIu64 + " at 0x%"PRIx64, i + 1, block_count, start); + return 1; + } + } + return 0; +} + +static int erase(struct exfat_dev* dev) +{ + const struct fs_object** pp; + off_t position = 0; + const size_t block_size = 1024 * 1024; + void* block = malloc(block_size); + + if (block == NULL) + { + exfat_error("failed to allocate erase block of %zu bytes", block_size); + return 1; + } + memset(block, 0, block_size); + + for (pp = objects; *pp; pp++) + { + position = ROUND_UP(position, (*pp)->get_alignment()); + if (erase_object(dev, block, block_size, position, + (*pp)->get_size()) != 0) + { + free(block); + return 1; + } + position += (*pp)->get_size(); + } + + free(block); + return 0; +} + +static int create(struct exfat_dev* dev) +{ + const struct fs_object** pp; + off_t position = 0; + + for (pp = objects; *pp; pp++) + { + position = ROUND_UP(position, (*pp)->get_alignment()); + if (exfat_seek(dev, position, SEEK_SET) == (off_t) -1) + { + exfat_error("seek to 0x%"PRIx64" failed", position); + return 1; + } + if ((*pp)->write(dev) != 0) + return 1; + position += (*pp)->get_size(); + } + return 0; +} + +int mkfs(struct exfat_dev* dev, off_t volume_size) +{ + if (check_size(volume_size) != 0) + return 1; + + exfat_debug("Creating... "); + //fputs("Creating... ", stdout); + //fflush(stdout); + if (erase(dev) != 0) + return 1; + if (create(dev) != 0) + return 1; + //puts("done."); + + //fputs("Flushing... ", stdout); + //fflush(stdout); + exfat_debug("Flushing... "); + if (exfat_fsync(dev) != 0) + return 1; + //puts("done."); + + return 0; +} + +off_t get_position(const struct fs_object* object) +{ + const struct fs_object** pp; + off_t position = 0; + + for (pp = objects; *pp; pp++) + { + position = ROUND_UP(position, (*pp)->get_alignment()); + if (*pp == object) + return position; + position += (*pp)->get_size(); + } + exfat_bug("unknown object"); + + return 0; +} + diff --git a/src/gui/Lib/exfat/src/mkfs/mkexfat.h b/src/gui/Lib/exfat/src/mkfs/mkexfat.h new file mode 100644 index 0000000..54816af --- /dev/null +++ b/src/gui/Lib/exfat/src/mkfs/mkexfat.h @@ -0,0 +1,49 @@ +/* + mkexfat.h (09.11.10) + FS creation engine. + + Free exFAT implementation. + Copyright (C) 2011-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef MKFS_MKEXFAT_H_INCLUDED +#define MKFS_MKEXFAT_H_INCLUDED + +#include "exfat.h" + +struct fs_object +{ + off_t (*get_alignment)(void); + off_t (*get_size)(void); + int (*write)(struct exfat_dev* dev); +}; + +extern const struct fs_object* objects[]; + +int get_sector_bits(void); +int get_spc_bits(void); +off_t get_volume_size(void); +const le16_t* get_volume_label(void); +uint32_t get_volume_serial(void); +uint64_t get_first_sector(void); +int get_sector_size(void); +int get_cluster_size(void); + +int mkfs(struct exfat_dev* dev, off_t volume_size); +off_t get_position(const struct fs_object* object); + +#endif /* ifndef MKFS_MKEXFAT_H_INCLUDED */ diff --git a/src/gui/Lib/exfat/src/mkfs/mkexfat_main.c b/src/gui/Lib/exfat/src/mkfs/mkexfat_main.c new file mode 100644 index 0000000..3304104 --- /dev/null +++ b/src/gui/Lib/exfat/src/mkfs/mkexfat_main.c @@ -0,0 +1,268 @@ +/* + main.c (15.08.10) + Creates exFAT file system. + + Free exFAT implementation. + Copyright (C) 2011-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "mkexfat.h" +#include "vbr.h" +#include "fat.h" +#include "cbm.h" +#include "uct.h" +#include "rootdir.h" +#include "exfat.h" +#include +#include +#include +#include +#include +#include +#include + +const struct fs_object* objects[] = +{ + &vbr, + &vbr, + &fat, + /* clusters heap */ + &cbm, + &uct, + &rootdir, + NULL, +}; + +static struct +{ + int sector_bits; + int spc_bits; + off_t volume_size; + le16_t volume_label[EXFAT_ENAME_MAX + 1]; + uint32_t volume_serial; + uint64_t first_sector; +} +param; + +extern int g_hiso_exfat_disk_fd; +extern uint64_t g_hiso_exfat_part_size; + +int get_sector_bits(void) +{ + return param.sector_bits; +} + +int get_spc_bits(void) +{ + return param.spc_bits; +} + +off_t get_volume_size(void) +{ + return param.volume_size; +} + +const le16_t* get_volume_label(void) +{ + return param.volume_label; +} + +uint32_t get_volume_serial(void) +{ + return param.volume_serial; +} + +uint64_t get_first_sector(void) +{ + return param.first_sector; +} + +int get_sector_size(void) +{ + return 1 << get_sector_bits(); +} + +int get_cluster_size(void) +{ + return get_sector_size() << get_spc_bits(); +} + +static int setup_spc_bits(int sector_bits, int user_defined, off_t volume_size) +{ + int i; + + if (user_defined != -1) + { + off_t cluster_size = 1 << sector_bits << user_defined; + if (volume_size / cluster_size > EXFAT_LAST_DATA_CLUSTER) + { + struct exfat_human_bytes chb, vhb; + + exfat_humanize_bytes(cluster_size, &chb); + exfat_humanize_bytes(volume_size, &vhb); + exfat_error("cluster size %"PRIu64" %s is too small for " + "%"PRIu64" %s volume, try -s %d", + chb.value, chb.unit, + vhb.value, vhb.unit, + 1 << setup_spc_bits(sector_bits, -1, volume_size)); + return -1; + } + return user_defined; + } + + if (volume_size < 256ull * 1024 * 1024) + return MAX(0, 12 - sector_bits); /* 4 KB */ + if (volume_size < 32ull * 1024 * 1024 * 1024) + return MAX(0, 15 - sector_bits); /* 32 KB */ + + for (i = 17; ; i++) /* 128 KB or more */ + if (DIV_ROUND_UP(volume_size, 1 << i) <= EXFAT_LAST_DATA_CLUSTER) + return MAX(0, i - sector_bits); +} + +static int setup_volume_label(le16_t label[EXFAT_ENAME_MAX + 1], const char* s) +{ + memset(label, 0, (EXFAT_ENAME_MAX + 1) * sizeof(le16_t)); + if (s == NULL) + return 0; + return utf8_to_utf16(label, s, EXFAT_ENAME_MAX + 1, strlen(s)); +} + +static uint32_t setup_volume_serial(uint32_t user_defined) +{ + struct timeval now; + + if (user_defined != 0) + return user_defined; + + if (gettimeofday(&now, NULL) != 0) + { + exfat_error("failed to form volume id"); + return 0; + } + return (now.tv_sec << 20) | now.tv_usec; +} + +static int setup(struct exfat_dev* dev, int sector_bits, int spc_bits, + const char* volume_label, uint32_t volume_serial, + uint64_t first_sector) +{ + param.sector_bits = sector_bits; + param.first_sector = first_sector; + param.volume_size = exfat_get_size(dev); + + param.spc_bits = setup_spc_bits(sector_bits, spc_bits, param.volume_size); + if (param.spc_bits == -1) + return 1; + + if (setup_volume_label(param.volume_label, volume_label) != 0) + return 1; + + param.volume_serial = setup_volume_serial(volume_serial); + if (param.volume_serial == 0) + return 1; + + return mkfs(dev, param.volume_size); +} + +static int logarithm2(int n) +{ + int i; + + for (i = 0; i < sizeof(int) * CHAR_BIT - 1; i++) + if ((1 << i) == n) + return i; + return -1; +} + +static void usage(const char* prog) +{ + fprintf(stderr, "Usage: %s [-i volume-id] [-n label] " + "[-p partition-first-sector] " + "[-s sectors-per-cluster] [-V] \n", prog); + exit(1); +} + +int mkexfat_main(const char *devpath, int fd, uint64_t part_sector_count) +{ + int spc_bits = -1; + uint32_t volume_serial = 0; + uint64_t first_sector = 0; + struct exfat_dev* dev; + +#if 0 + while ((opt = getopt(argc, argv, "i:n:p:s:V")) != -1) + { + switch (opt) + { + case 'i': + volume_serial = strtol(optarg, NULL, 16); + break; + case 'n': + volume_label = optarg; + break; + case 'p': + first_sector = strtoll(optarg, NULL, 10); + break; + case 's': + spc_bits = logarithm2(atoi(optarg)); + if (spc_bits < 0) + { + exfat_error("invalid option value: '%s'", optarg); + return 1; + } + break; + case 'V': + puts("Copyright (C) 2011-2018 Andrew Nayenko"); + return 0; + default: + usage(argv[0]); + break; + } + } +#endif /* #if 0 */ + + /* + * DiskSize > 32GB Cluster Size use 128KB + * DiskSize < 32GB Cluster Size use 32KB + */ + if ((part_sector_count / 2097152) > 32) + { + spc_bits = logarithm2(256); + } + else + { + spc_bits = logarithm2(64); + } + + g_hiso_exfat_disk_fd = fd; + g_hiso_exfat_part_size = part_sector_count * 512; + + dev = exfat_open(devpath, EXFAT_MODE_RW); + if (dev == NULL) + return 1; + if (setup(dev, 9, spc_bits, "Hiperiso", volume_serial, first_sector) != 0) + { + exfat_close(dev); + return 1; + } + if (exfat_close(dev) != 0) + return 1; + + return 0; +} + diff --git a/src/gui/Lib/exfat/src/mkfs/rootdir.c b/src/gui/Lib/exfat/src/mkfs/rootdir.c new file mode 100644 index 0000000..323da8a --- /dev/null +++ b/src/gui/Lib/exfat/src/mkfs/rootdir.c @@ -0,0 +1,102 @@ +/* + rootdir.c (09.11.10) + Root directory creation code. + + Free exFAT implementation. + Copyright (C) 2011-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "rootdir.h" +#include "uct.h" +#include "cbm.h" +#include "uctc.h" +#include + +static off_t rootdir_alignment(void) +{ + return get_cluster_size(); +} + +static off_t rootdir_size(void) +{ + return get_cluster_size(); +} + +static void init_label_entry(struct exfat_entry_label* label_entry) +{ + memset(label_entry, 0, sizeof(struct exfat_entry_label)); + label_entry->type = EXFAT_ENTRY_LABEL ^ EXFAT_ENTRY_VALID; + + if (utf16_length(get_volume_label()) == 0) + return; + + memcpy(label_entry->name, get_volume_label(), + EXFAT_ENAME_MAX * sizeof(le16_t)); + label_entry->length = utf16_length(get_volume_label()); + label_entry->type |= EXFAT_ENTRY_VALID; +} + +static void init_bitmap_entry(struct exfat_entry_bitmap* bitmap_entry) +{ + memset(bitmap_entry, 0, sizeof(struct exfat_entry_bitmap)); + bitmap_entry->type = EXFAT_ENTRY_BITMAP; + bitmap_entry->start_cluster = cpu_to_le32(EXFAT_FIRST_DATA_CLUSTER); + bitmap_entry->size = cpu_to_le64(cbm.get_size()); +} + +static void init_upcase_entry(struct exfat_entry_upcase* upcase_entry) +{ + size_t i; + uint32_t sum = 0; + + for (i = 0; i < sizeof(upcase_table); i++) + sum = ((sum << 31) | (sum >> 1)) + upcase_table[i]; + + memset(upcase_entry, 0, sizeof(struct exfat_entry_upcase)); + upcase_entry->type = EXFAT_ENTRY_UPCASE; + upcase_entry->checksum = cpu_to_le32(sum); + upcase_entry->start_cluster = cpu_to_le32( + (get_position(&uct) - get_position(&cbm)) / get_cluster_size() + + EXFAT_FIRST_DATA_CLUSTER); + upcase_entry->size = cpu_to_le64(sizeof(upcase_table)); +} + +static int rootdir_write(struct exfat_dev* dev) +{ + struct exfat_entry_label label_entry; + struct exfat_entry_bitmap bitmap_entry; + struct exfat_entry_upcase upcase_entry; + + init_label_entry(&label_entry); + init_bitmap_entry(&bitmap_entry); + init_upcase_entry(&upcase_entry); + + if (exfat_write(dev, &label_entry, sizeof(struct exfat_entry)) < 0) + return 1; + if (exfat_write(dev, &bitmap_entry, sizeof(struct exfat_entry)) < 0) + return 1; + if (exfat_write(dev, &upcase_entry, sizeof(struct exfat_entry)) < 0) + return 1; + return 0; +} + +const struct fs_object rootdir = +{ + .get_alignment = rootdir_alignment, + .get_size = rootdir_size, + .write = rootdir_write, +}; diff --git a/src/gui/Lib/exfat/src/mkfs/rootdir.h b/src/gui/Lib/exfat/src/mkfs/rootdir.h new file mode 100644 index 0000000..87f437f --- /dev/null +++ b/src/gui/Lib/exfat/src/mkfs/rootdir.h @@ -0,0 +1,30 @@ +/* + rootdir.h (09.11.10) + Root directory creation code. + + Free exFAT implementation. + Copyright (C) 2011-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef MKFS_ROOTDIR_H_INCLUDED +#define MKFS_ROOTDIR_H_INCLUDED + +#include "mkexfat.h" + +extern const struct fs_object rootdir; + +#endif /* ifndef MKFS_ROOTDIR_H_INCLUDED */ diff --git a/src/gui/Lib/exfat/src/mkfs/uct.c b/src/gui/Lib/exfat/src/mkfs/uct.c new file mode 100644 index 0000000..98cdce8 --- /dev/null +++ b/src/gui/Lib/exfat/src/mkfs/uct.c @@ -0,0 +1,52 @@ +/* + uct.c (09.11.10) + Upper Case Table creation code. + + Free exFAT implementation. + Copyright (C) 2011-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "uct.h" +#include "uctc.h" + +static off_t uct_alignment(void) +{ + return get_cluster_size(); +} + +static off_t uct_size(void) +{ + return sizeof(upcase_table); +} + +static int uct_write(struct exfat_dev* dev) +{ + if (exfat_write(dev, upcase_table, sizeof(upcase_table)) < 0) + { + exfat_error("failed to write upcase table of %zu bytes", + sizeof(upcase_table)); + return 1; + } + return 0; +} + +const struct fs_object uct = +{ + .get_alignment = uct_alignment, + .get_size = uct_size, + .write = uct_write, +}; diff --git a/src/gui/Lib/exfat/src/mkfs/uct.h b/src/gui/Lib/exfat/src/mkfs/uct.h new file mode 100644 index 0000000..ce619ec --- /dev/null +++ b/src/gui/Lib/exfat/src/mkfs/uct.h @@ -0,0 +1,30 @@ +/* + uct.h (09.11.10) + Upper Case Table creation code. + + Free exFAT implementation. + Copyright (C) 2011-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef MKFS_UCT_H_INCLUDED +#define MKFS_UCT_H_INCLUDED + +#include "mkexfat.h" + +extern const struct fs_object uct; + +#endif /* ifndef MKFS_UCT_H_INCLUDED */ diff --git a/src/gui/Lib/exfat/src/mkfs/uctc.c b/src/gui/Lib/exfat/src/mkfs/uctc.c new file mode 100644 index 0000000..518219c --- /dev/null +++ b/src/gui/Lib/exfat/src/mkfs/uctc.c @@ -0,0 +1,757 @@ +/* + uctc.c (30.04.12) + Upper Case Table contents. + + Free exFAT implementation. + Copyright (C) 2011-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "uctc.h" + +uint8_t upcase_table[5836] = +{ + 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, + 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, + 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, + 0x0c, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, + 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x13, 0x00, + 0x14, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, + 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, + 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, + 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, + 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, + 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, + 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, + 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, + 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, + 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, + 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, + 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, + 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, + 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, + 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, + 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, + 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, + 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, + 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5f, 0x00, + 0x60, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, + 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, + 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, + 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, + 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, + 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, + 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x7b, 0x00, + 0x7c, 0x00, 0x7d, 0x00, 0x7e, 0x00, 0x7f, 0x00, + 0x80, 0x00, 0x81, 0x00, 0x82, 0x00, 0x83, 0x00, + 0x84, 0x00, 0x85, 0x00, 0x86, 0x00, 0x87, 0x00, + 0x88, 0x00, 0x89, 0x00, 0x8a, 0x00, 0x8b, 0x00, + 0x8c, 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x8f, 0x00, + 0x90, 0x00, 0x91, 0x00, 0x92, 0x00, 0x93, 0x00, + 0x94, 0x00, 0x95, 0x00, 0x96, 0x00, 0x97, 0x00, + 0x98, 0x00, 0x99, 0x00, 0x9a, 0x00, 0x9b, 0x00, + 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, + 0xa0, 0x00, 0xa1, 0x00, 0xa2, 0x00, 0xa3, 0x00, + 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, 0x00, + 0xa8, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0xab, 0x00, + 0xac, 0x00, 0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, + 0xb0, 0x00, 0xb1, 0x00, 0xb2, 0x00, 0xb3, 0x00, + 0xb4, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb7, 0x00, + 0xb8, 0x00, 0xb9, 0x00, 0xba, 0x00, 0xbb, 0x00, + 0xbc, 0x00, 0xbd, 0x00, 0xbe, 0x00, 0xbf, 0x00, + 0xc0, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0xc3, 0x00, + 0xc4, 0x00, 0xc5, 0x00, 0xc6, 0x00, 0xc7, 0x00, + 0xc8, 0x00, 0xc9, 0x00, 0xca, 0x00, 0xcb, 0x00, + 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcf, 0x00, + 0xd0, 0x00, 0xd1, 0x00, 0xd2, 0x00, 0xd3, 0x00, + 0xd4, 0x00, 0xd5, 0x00, 0xd6, 0x00, 0xd7, 0x00, + 0xd8, 0x00, 0xd9, 0x00, 0xda, 0x00, 0xdb, 0x00, + 0xdc, 0x00, 0xdd, 0x00, 0xde, 0x00, 0xdf, 0x00, + 0xc0, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0xc3, 0x00, + 0xc4, 0x00, 0xc5, 0x00, 0xc6, 0x00, 0xc7, 0x00, + 0xc8, 0x00, 0xc9, 0x00, 0xca, 0x00, 0xcb, 0x00, + 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcf, 0x00, + 0xd0, 0x00, 0xd1, 0x00, 0xd2, 0x00, 0xd3, 0x00, + 0xd4, 0x00, 0xd5, 0x00, 0xd6, 0x00, 0xf7, 0x00, + 0xd8, 0x00, 0xd9, 0x00, 0xda, 0x00, 0xdb, 0x00, + 0xdc, 0x00, 0xdd, 0x00, 0xde, 0x00, 0x78, 0x01, + 0x00, 0x01, 0x00, 0x01, 0x02, 0x01, 0x02, 0x01, + 0x04, 0x01, 0x04, 0x01, 0x06, 0x01, 0x06, 0x01, + 0x08, 0x01, 0x08, 0x01, 0x0a, 0x01, 0x0a, 0x01, + 0x0c, 0x01, 0x0c, 0x01, 0x0e, 0x01, 0x0e, 0x01, + 0x10, 0x01, 0x10, 0x01, 0x12, 0x01, 0x12, 0x01, + 0x14, 0x01, 0x14, 0x01, 0x16, 0x01, 0x16, 0x01, + 0x18, 0x01, 0x18, 0x01, 0x1a, 0x01, 0x1a, 0x01, + 0x1c, 0x01, 0x1c, 0x01, 0x1e, 0x01, 0x1e, 0x01, + 0x20, 0x01, 0x20, 0x01, 0x22, 0x01, 0x22, 0x01, + 0x24, 0x01, 0x24, 0x01, 0x26, 0x01, 0x26, 0x01, + 0x28, 0x01, 0x28, 0x01, 0x2a, 0x01, 0x2a, 0x01, + 0x2c, 0x01, 0x2c, 0x01, 0x2e, 0x01, 0x2e, 0x01, + 0x30, 0x01, 0x31, 0x01, 0x32, 0x01, 0x32, 0x01, + 0x34, 0x01, 0x34, 0x01, 0x36, 0x01, 0x36, 0x01, + 0x38, 0x01, 0x39, 0x01, 0x39, 0x01, 0x3b, 0x01, + 0x3b, 0x01, 0x3d, 0x01, 0x3d, 0x01, 0x3f, 0x01, + 0x3f, 0x01, 0x41, 0x01, 0x41, 0x01, 0x43, 0x01, + 0x43, 0x01, 0x45, 0x01, 0x45, 0x01, 0x47, 0x01, + 0x47, 0x01, 0x49, 0x01, 0x4a, 0x01, 0x4a, 0x01, + 0x4c, 0x01, 0x4c, 0x01, 0x4e, 0x01, 0x4e, 0x01, + 0x50, 0x01, 0x50, 0x01, 0x52, 0x01, 0x52, 0x01, + 0x54, 0x01, 0x54, 0x01, 0x56, 0x01, 0x56, 0x01, + 0x58, 0x01, 0x58, 0x01, 0x5a, 0x01, 0x5a, 0x01, + 0x5c, 0x01, 0x5c, 0x01, 0x5e, 0x01, 0x5e, 0x01, + 0x60, 0x01, 0x60, 0x01, 0x62, 0x01, 0x62, 0x01, + 0x64, 0x01, 0x64, 0x01, 0x66, 0x01, 0x66, 0x01, + 0x68, 0x01, 0x68, 0x01, 0x6a, 0x01, 0x6a, 0x01, + 0x6c, 0x01, 0x6c, 0x01, 0x6e, 0x01, 0x6e, 0x01, + 0x70, 0x01, 0x70, 0x01, 0x72, 0x01, 0x72, 0x01, + 0x74, 0x01, 0x74, 0x01, 0x76, 0x01, 0x76, 0x01, + 0x78, 0x01, 0x79, 0x01, 0x79, 0x01, 0x7b, 0x01, + 0x7b, 0x01, 0x7d, 0x01, 0x7d, 0x01, 0x7f, 0x01, + 0x43, 0x02, 0x81, 0x01, 0x82, 0x01, 0x82, 0x01, + 0x84, 0x01, 0x84, 0x01, 0x86, 0x01, 0x87, 0x01, + 0x87, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, + 0x8b, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, + 0x90, 0x01, 0x91, 0x01, 0x91, 0x01, 0x93, 0x01, + 0x94, 0x01, 0xf6, 0x01, 0x96, 0x01, 0x97, 0x01, + 0x98, 0x01, 0x98, 0x01, 0x3d, 0x02, 0x9b, 0x01, + 0x9c, 0x01, 0x9d, 0x01, 0x20, 0x02, 0x9f, 0x01, + 0xa0, 0x01, 0xa0, 0x01, 0xa2, 0x01, 0xa2, 0x01, + 0xa4, 0x01, 0xa4, 0x01, 0xa6, 0x01, 0xa7, 0x01, + 0xa7, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0xab, 0x01, + 0xac, 0x01, 0xac, 0x01, 0xae, 0x01, 0xaf, 0x01, + 0xaf, 0x01, 0xb1, 0x01, 0xb2, 0x01, 0xb3, 0x01, + 0xb3, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xb7, 0x01, + 0xb8, 0x01, 0xb8, 0x01, 0xba, 0x01, 0xbb, 0x01, + 0xbc, 0x01, 0xbc, 0x01, 0xbe, 0x01, 0xf7, 0x01, + 0xc0, 0x01, 0xc1, 0x01, 0xc2, 0x01, 0xc3, 0x01, + 0xc4, 0x01, 0xc5, 0x01, 0xc4, 0x01, 0xc7, 0x01, + 0xc8, 0x01, 0xc7, 0x01, 0xca, 0x01, 0xcb, 0x01, + 0xca, 0x01, 0xcd, 0x01, 0xcd, 0x01, 0xcf, 0x01, + 0xcf, 0x01, 0xd1, 0x01, 0xd1, 0x01, 0xd3, 0x01, + 0xd3, 0x01, 0xd5, 0x01, 0xd5, 0x01, 0xd7, 0x01, + 0xd7, 0x01, 0xd9, 0x01, 0xd9, 0x01, 0xdb, 0x01, + 0xdb, 0x01, 0x8e, 0x01, 0xde, 0x01, 0xde, 0x01, + 0xe0, 0x01, 0xe0, 0x01, 0xe2, 0x01, 0xe2, 0x01, + 0xe4, 0x01, 0xe4, 0x01, 0xe6, 0x01, 0xe6, 0x01, + 0xe8, 0x01, 0xe8, 0x01, 0xea, 0x01, 0xea, 0x01, + 0xec, 0x01, 0xec, 0x01, 0xee, 0x01, 0xee, 0x01, + 0xf0, 0x01, 0xf1, 0x01, 0xf2, 0x01, 0xf1, 0x01, + 0xf4, 0x01, 0xf4, 0x01, 0xf6, 0x01, 0xf7, 0x01, + 0xf8, 0x01, 0xf8, 0x01, 0xfa, 0x01, 0xfa, 0x01, + 0xfc, 0x01, 0xfc, 0x01, 0xfe, 0x01, 0xfe, 0x01, + 0x00, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x04, 0x02, 0x04, 0x02, 0x06, 0x02, 0x06, 0x02, + 0x08, 0x02, 0x08, 0x02, 0x0a, 0x02, 0x0a, 0x02, + 0x0c, 0x02, 0x0c, 0x02, 0x0e, 0x02, 0x0e, 0x02, + 0x10, 0x02, 0x10, 0x02, 0x12, 0x02, 0x12, 0x02, + 0x14, 0x02, 0x14, 0x02, 0x16, 0x02, 0x16, 0x02, + 0x18, 0x02, 0x18, 0x02, 0x1a, 0x02, 0x1a, 0x02, + 0x1c, 0x02, 0x1c, 0x02, 0x1e, 0x02, 0x1e, 0x02, + 0x20, 0x02, 0x21, 0x02, 0x22, 0x02, 0x22, 0x02, + 0x24, 0x02, 0x24, 0x02, 0x26, 0x02, 0x26, 0x02, + 0x28, 0x02, 0x28, 0x02, 0x2a, 0x02, 0x2a, 0x02, + 0x2c, 0x02, 0x2c, 0x02, 0x2e, 0x02, 0x2e, 0x02, + 0x30, 0x02, 0x30, 0x02, 0x32, 0x02, 0x32, 0x02, + 0x34, 0x02, 0x35, 0x02, 0x36, 0x02, 0x37, 0x02, + 0x38, 0x02, 0x39, 0x02, 0x65, 0x2c, 0x3b, 0x02, + 0x3b, 0x02, 0x3d, 0x02, 0x66, 0x2c, 0x3f, 0x02, + 0x40, 0x02, 0x41, 0x02, 0x41, 0x02, 0x43, 0x02, + 0x44, 0x02, 0x45, 0x02, 0x46, 0x02, 0x46, 0x02, + 0x48, 0x02, 0x48, 0x02, 0x4a, 0x02, 0x4a, 0x02, + 0x4c, 0x02, 0x4c, 0x02, 0x4e, 0x02, 0x4e, 0x02, + 0x50, 0x02, 0x51, 0x02, 0x52, 0x02, 0x81, 0x01, + 0x86, 0x01, 0x55, 0x02, 0x89, 0x01, 0x8a, 0x01, + 0x58, 0x02, 0x8f, 0x01, 0x5a, 0x02, 0x90, 0x01, + 0x5c, 0x02, 0x5d, 0x02, 0x5e, 0x02, 0x5f, 0x02, + 0x93, 0x01, 0x61, 0x02, 0x62, 0x02, 0x94, 0x01, + 0x64, 0x02, 0x65, 0x02, 0x66, 0x02, 0x67, 0x02, + 0x97, 0x01, 0x96, 0x01, 0x6a, 0x02, 0x62, 0x2c, + 0x6c, 0x02, 0x6d, 0x02, 0x6e, 0x02, 0x9c, 0x01, + 0x70, 0x02, 0x71, 0x02, 0x9d, 0x01, 0x73, 0x02, + 0x74, 0x02, 0x9f, 0x01, 0x76, 0x02, 0x77, 0x02, + 0x78, 0x02, 0x79, 0x02, 0x7a, 0x02, 0x7b, 0x02, + 0x7c, 0x02, 0x64, 0x2c, 0x7e, 0x02, 0x7f, 0x02, + 0xa6, 0x01, 0x81, 0x02, 0x82, 0x02, 0xa9, 0x01, + 0x84, 0x02, 0x85, 0x02, 0x86, 0x02, 0x87, 0x02, + 0xae, 0x01, 0x44, 0x02, 0xb1, 0x01, 0xb2, 0x01, + 0x45, 0x02, 0x8d, 0x02, 0x8e, 0x02, 0x8f, 0x02, + 0x90, 0x02, 0x91, 0x02, 0xb7, 0x01, 0x93, 0x02, + 0x94, 0x02, 0x95, 0x02, 0x96, 0x02, 0x97, 0x02, + 0x98, 0x02, 0x99, 0x02, 0x9a, 0x02, 0x9b, 0x02, + 0x9c, 0x02, 0x9d, 0x02, 0x9e, 0x02, 0x9f, 0x02, + 0xa0, 0x02, 0xa1, 0x02, 0xa2, 0x02, 0xa3, 0x02, + 0xa4, 0x02, 0xa5, 0x02, 0xa6, 0x02, 0xa7, 0x02, + 0xa8, 0x02, 0xa9, 0x02, 0xaa, 0x02, 0xab, 0x02, + 0xac, 0x02, 0xad, 0x02, 0xae, 0x02, 0xaf, 0x02, + 0xb0, 0x02, 0xb1, 0x02, 0xb2, 0x02, 0xb3, 0x02, + 0xb4, 0x02, 0xb5, 0x02, 0xb6, 0x02, 0xb7, 0x02, + 0xb8, 0x02, 0xb9, 0x02, 0xba, 0x02, 0xbb, 0x02, + 0xbc, 0x02, 0xbd, 0x02, 0xbe, 0x02, 0xbf, 0x02, + 0xc0, 0x02, 0xc1, 0x02, 0xc2, 0x02, 0xc3, 0x02, + 0xc4, 0x02, 0xc5, 0x02, 0xc6, 0x02, 0xc7, 0x02, + 0xc8, 0x02, 0xc9, 0x02, 0xca, 0x02, 0xcb, 0x02, + 0xcc, 0x02, 0xcd, 0x02, 0xce, 0x02, 0xcf, 0x02, + 0xd0, 0x02, 0xd1, 0x02, 0xd2, 0x02, 0xd3, 0x02, + 0xd4, 0x02, 0xd5, 0x02, 0xd6, 0x02, 0xd7, 0x02, + 0xd8, 0x02, 0xd9, 0x02, 0xda, 0x02, 0xdb, 0x02, + 0xdc, 0x02, 0xdd, 0x02, 0xde, 0x02, 0xdf, 0x02, + 0xe0, 0x02, 0xe1, 0x02, 0xe2, 0x02, 0xe3, 0x02, + 0xe4, 0x02, 0xe5, 0x02, 0xe6, 0x02, 0xe7, 0x02, + 0xe8, 0x02, 0xe9, 0x02, 0xea, 0x02, 0xeb, 0x02, + 0xec, 0x02, 0xed, 0x02, 0xee, 0x02, 0xef, 0x02, + 0xf0, 0x02, 0xf1, 0x02, 0xf2, 0x02, 0xf3, 0x02, + 0xf4, 0x02, 0xf5, 0x02, 0xf6, 0x02, 0xf7, 0x02, + 0xf8, 0x02, 0xf9, 0x02, 0xfa, 0x02, 0xfb, 0x02, + 0xfc, 0x02, 0xfd, 0x02, 0xfe, 0x02, 0xff, 0x02, + 0x00, 0x03, 0x01, 0x03, 0x02, 0x03, 0x03, 0x03, + 0x04, 0x03, 0x05, 0x03, 0x06, 0x03, 0x07, 0x03, + 0x08, 0x03, 0x09, 0x03, 0x0a, 0x03, 0x0b, 0x03, + 0x0c, 0x03, 0x0d, 0x03, 0x0e, 0x03, 0x0f, 0x03, + 0x10, 0x03, 0x11, 0x03, 0x12, 0x03, 0x13, 0x03, + 0x14, 0x03, 0x15, 0x03, 0x16, 0x03, 0x17, 0x03, + 0x18, 0x03, 0x19, 0x03, 0x1a, 0x03, 0x1b, 0x03, + 0x1c, 0x03, 0x1d, 0x03, 0x1e, 0x03, 0x1f, 0x03, + 0x20, 0x03, 0x21, 0x03, 0x22, 0x03, 0x23, 0x03, + 0x24, 0x03, 0x25, 0x03, 0x26, 0x03, 0x27, 0x03, + 0x28, 0x03, 0x29, 0x03, 0x2a, 0x03, 0x2b, 0x03, + 0x2c, 0x03, 0x2d, 0x03, 0x2e, 0x03, 0x2f, 0x03, + 0x30, 0x03, 0x31, 0x03, 0x32, 0x03, 0x33, 0x03, + 0x34, 0x03, 0x35, 0x03, 0x36, 0x03, 0x37, 0x03, + 0x38, 0x03, 0x39, 0x03, 0x3a, 0x03, 0x3b, 0x03, + 0x3c, 0x03, 0x3d, 0x03, 0x3e, 0x03, 0x3f, 0x03, + 0x40, 0x03, 0x41, 0x03, 0x42, 0x03, 0x43, 0x03, + 0x44, 0x03, 0x45, 0x03, 0x46, 0x03, 0x47, 0x03, + 0x48, 0x03, 0x49, 0x03, 0x4a, 0x03, 0x4b, 0x03, + 0x4c, 0x03, 0x4d, 0x03, 0x4e, 0x03, 0x4f, 0x03, + 0x50, 0x03, 0x51, 0x03, 0x52, 0x03, 0x53, 0x03, + 0x54, 0x03, 0x55, 0x03, 0x56, 0x03, 0x57, 0x03, + 0x58, 0x03, 0x59, 0x03, 0x5a, 0x03, 0x5b, 0x03, + 0x5c, 0x03, 0x5d, 0x03, 0x5e, 0x03, 0x5f, 0x03, + 0x60, 0x03, 0x61, 0x03, 0x62, 0x03, 0x63, 0x03, + 0x64, 0x03, 0x65, 0x03, 0x66, 0x03, 0x67, 0x03, + 0x68, 0x03, 0x69, 0x03, 0x6a, 0x03, 0x6b, 0x03, + 0x6c, 0x03, 0x6d, 0x03, 0x6e, 0x03, 0x6f, 0x03, + 0x70, 0x03, 0x71, 0x03, 0x72, 0x03, 0x73, 0x03, + 0x74, 0x03, 0x75, 0x03, 0x76, 0x03, 0x77, 0x03, + 0x78, 0x03, 0x79, 0x03, 0x7a, 0x03, 0xfd, 0x03, + 0xfe, 0x03, 0xff, 0x03, 0x7e, 0x03, 0x7f, 0x03, + 0x80, 0x03, 0x81, 0x03, 0x82, 0x03, 0x83, 0x03, + 0x84, 0x03, 0x85, 0x03, 0x86, 0x03, 0x87, 0x03, + 0x88, 0x03, 0x89, 0x03, 0x8a, 0x03, 0x8b, 0x03, + 0x8c, 0x03, 0x8d, 0x03, 0x8e, 0x03, 0x8f, 0x03, + 0x90, 0x03, 0x91, 0x03, 0x92, 0x03, 0x93, 0x03, + 0x94, 0x03, 0x95, 0x03, 0x96, 0x03, 0x97, 0x03, + 0x98, 0x03, 0x99, 0x03, 0x9a, 0x03, 0x9b, 0x03, + 0x9c, 0x03, 0x9d, 0x03, 0x9e, 0x03, 0x9f, 0x03, + 0xa0, 0x03, 0xa1, 0x03, 0xa2, 0x03, 0xa3, 0x03, + 0xa4, 0x03, 0xa5, 0x03, 0xa6, 0x03, 0xa7, 0x03, + 0xa8, 0x03, 0xa9, 0x03, 0xaa, 0x03, 0xab, 0x03, + 0x86, 0x03, 0x88, 0x03, 0x89, 0x03, 0x8a, 0x03, + 0xb0, 0x03, 0x91, 0x03, 0x92, 0x03, 0x93, 0x03, + 0x94, 0x03, 0x95, 0x03, 0x96, 0x03, 0x97, 0x03, + 0x98, 0x03, 0x99, 0x03, 0x9a, 0x03, 0x9b, 0x03, + 0x9c, 0x03, 0x9d, 0x03, 0x9e, 0x03, 0x9f, 0x03, + 0xa0, 0x03, 0xa1, 0x03, 0xa3, 0x03, 0xa3, 0x03, + 0xa4, 0x03, 0xa5, 0x03, 0xa6, 0x03, 0xa7, 0x03, + 0xa8, 0x03, 0xa9, 0x03, 0xaa, 0x03, 0xab, 0x03, + 0x8c, 0x03, 0x8e, 0x03, 0x8f, 0x03, 0xcf, 0x03, + 0xd0, 0x03, 0xd1, 0x03, 0xd2, 0x03, 0xd3, 0x03, + 0xd4, 0x03, 0xd5, 0x03, 0xd6, 0x03, 0xd7, 0x03, + 0xd8, 0x03, 0xd8, 0x03, 0xda, 0x03, 0xda, 0x03, + 0xdc, 0x03, 0xdc, 0x03, 0xde, 0x03, 0xde, 0x03, + 0xe0, 0x03, 0xe0, 0x03, 0xe2, 0x03, 0xe2, 0x03, + 0xe4, 0x03, 0xe4, 0x03, 0xe6, 0x03, 0xe6, 0x03, + 0xe8, 0x03, 0xe8, 0x03, 0xea, 0x03, 0xea, 0x03, + 0xec, 0x03, 0xec, 0x03, 0xee, 0x03, 0xee, 0x03, + 0xf0, 0x03, 0xf1, 0x03, 0xf9, 0x03, 0xf3, 0x03, + 0xf4, 0x03, 0xf5, 0x03, 0xf6, 0x03, 0xf7, 0x03, + 0xf7, 0x03, 0xf9, 0x03, 0xfa, 0x03, 0xfa, 0x03, + 0xfc, 0x03, 0xfd, 0x03, 0xfe, 0x03, 0xff, 0x03, + 0x00, 0x04, 0x01, 0x04, 0x02, 0x04, 0x03, 0x04, + 0x04, 0x04, 0x05, 0x04, 0x06, 0x04, 0x07, 0x04, + 0x08, 0x04, 0x09, 0x04, 0x0a, 0x04, 0x0b, 0x04, + 0x0c, 0x04, 0x0d, 0x04, 0x0e, 0x04, 0x0f, 0x04, + 0x10, 0x04, 0x11, 0x04, 0x12, 0x04, 0x13, 0x04, + 0x14, 0x04, 0x15, 0x04, 0x16, 0x04, 0x17, 0x04, + 0x18, 0x04, 0x19, 0x04, 0x1a, 0x04, 0x1b, 0x04, + 0x1c, 0x04, 0x1d, 0x04, 0x1e, 0x04, 0x1f, 0x04, + 0x20, 0x04, 0x21, 0x04, 0x22, 0x04, 0x23, 0x04, + 0x24, 0x04, 0x25, 0x04, 0x26, 0x04, 0x27, 0x04, + 0x28, 0x04, 0x29, 0x04, 0x2a, 0x04, 0x2b, 0x04, + 0x2c, 0x04, 0x2d, 0x04, 0x2e, 0x04, 0x2f, 0x04, + 0x10, 0x04, 0x11, 0x04, 0x12, 0x04, 0x13, 0x04, + 0x14, 0x04, 0x15, 0x04, 0x16, 0x04, 0x17, 0x04, + 0x18, 0x04, 0x19, 0x04, 0x1a, 0x04, 0x1b, 0x04, + 0x1c, 0x04, 0x1d, 0x04, 0x1e, 0x04, 0x1f, 0x04, + 0x20, 0x04, 0x21, 0x04, 0x22, 0x04, 0x23, 0x04, + 0x24, 0x04, 0x25, 0x04, 0x26, 0x04, 0x27, 0x04, + 0x28, 0x04, 0x29, 0x04, 0x2a, 0x04, 0x2b, 0x04, + 0x2c, 0x04, 0x2d, 0x04, 0x2e, 0x04, 0x2f, 0x04, + 0x00, 0x04, 0x01, 0x04, 0x02, 0x04, 0x03, 0x04, + 0x04, 0x04, 0x05, 0x04, 0x06, 0x04, 0x07, 0x04, + 0x08, 0x04, 0x09, 0x04, 0x0a, 0x04, 0x0b, 0x04, + 0x0c, 0x04, 0x0d, 0x04, 0x0e, 0x04, 0x0f, 0x04, + 0x60, 0x04, 0x60, 0x04, 0x62, 0x04, 0x62, 0x04, + 0x64, 0x04, 0x64, 0x04, 0x66, 0x04, 0x66, 0x04, + 0x68, 0x04, 0x68, 0x04, 0x6a, 0x04, 0x6a, 0x04, + 0x6c, 0x04, 0x6c, 0x04, 0x6e, 0x04, 0x6e, 0x04, + 0x70, 0x04, 0x70, 0x04, 0x72, 0x04, 0x72, 0x04, + 0x74, 0x04, 0x74, 0x04, 0x76, 0x04, 0x76, 0x04, + 0x78, 0x04, 0x78, 0x04, 0x7a, 0x04, 0x7a, 0x04, + 0x7c, 0x04, 0x7c, 0x04, 0x7e, 0x04, 0x7e, 0x04, + 0x80, 0x04, 0x80, 0x04, 0x82, 0x04, 0x83, 0x04, + 0x84, 0x04, 0x85, 0x04, 0x86, 0x04, 0x87, 0x04, + 0x88, 0x04, 0x89, 0x04, 0x8a, 0x04, 0x8a, 0x04, + 0x8c, 0x04, 0x8c, 0x04, 0x8e, 0x04, 0x8e, 0x04, + 0x90, 0x04, 0x90, 0x04, 0x92, 0x04, 0x92, 0x04, + 0x94, 0x04, 0x94, 0x04, 0x96, 0x04, 0x96, 0x04, + 0x98, 0x04, 0x98, 0x04, 0x9a, 0x04, 0x9a, 0x04, + 0x9c, 0x04, 0x9c, 0x04, 0x9e, 0x04, 0x9e, 0x04, + 0xa0, 0x04, 0xa0, 0x04, 0xa2, 0x04, 0xa2, 0x04, + 0xa4, 0x04, 0xa4, 0x04, 0xa6, 0x04, 0xa6, 0x04, + 0xa8, 0x04, 0xa8, 0x04, 0xaa, 0x04, 0xaa, 0x04, + 0xac, 0x04, 0xac, 0x04, 0xae, 0x04, 0xae, 0x04, + 0xb0, 0x04, 0xb0, 0x04, 0xb2, 0x04, 0xb2, 0x04, + 0xb4, 0x04, 0xb4, 0x04, 0xb6, 0x04, 0xb6, 0x04, + 0xb8, 0x04, 0xb8, 0x04, 0xba, 0x04, 0xba, 0x04, + 0xbc, 0x04, 0xbc, 0x04, 0xbe, 0x04, 0xbe, 0x04, + 0xc0, 0x04, 0xc1, 0x04, 0xc1, 0x04, 0xc3, 0x04, + 0xc3, 0x04, 0xc5, 0x04, 0xc5, 0x04, 0xc7, 0x04, + 0xc7, 0x04, 0xc9, 0x04, 0xc9, 0x04, 0xcb, 0x04, + 0xcb, 0x04, 0xcd, 0x04, 0xcd, 0x04, 0xc0, 0x04, + 0xd0, 0x04, 0xd0, 0x04, 0xd2, 0x04, 0xd2, 0x04, + 0xd4, 0x04, 0xd4, 0x04, 0xd6, 0x04, 0xd6, 0x04, + 0xd8, 0x04, 0xd8, 0x04, 0xda, 0x04, 0xda, 0x04, + 0xdc, 0x04, 0xdc, 0x04, 0xde, 0x04, 0xde, 0x04, + 0xe0, 0x04, 0xe0, 0x04, 0xe2, 0x04, 0xe2, 0x04, + 0xe4, 0x04, 0xe4, 0x04, 0xe6, 0x04, 0xe6, 0x04, + 0xe8, 0x04, 0xe8, 0x04, 0xea, 0x04, 0xea, 0x04, + 0xec, 0x04, 0xec, 0x04, 0xee, 0x04, 0xee, 0x04, + 0xf0, 0x04, 0xf0, 0x04, 0xf2, 0x04, 0xf2, 0x04, + 0xf4, 0x04, 0xf4, 0x04, 0xf6, 0x04, 0xf6, 0x04, + 0xf8, 0x04, 0xf8, 0x04, 0xfa, 0x04, 0xfa, 0x04, + 0xfc, 0x04, 0xfc, 0x04, 0xfe, 0x04, 0xfe, 0x04, + 0x00, 0x05, 0x00, 0x05, 0x02, 0x05, 0x02, 0x05, + 0x04, 0x05, 0x04, 0x05, 0x06, 0x05, 0x06, 0x05, + 0x08, 0x05, 0x08, 0x05, 0x0a, 0x05, 0x0a, 0x05, + 0x0c, 0x05, 0x0c, 0x05, 0x0e, 0x05, 0x0e, 0x05, + 0x10, 0x05, 0x10, 0x05, 0x12, 0x05, 0x12, 0x05, + 0x14, 0x05, 0x15, 0x05, 0x16, 0x05, 0x17, 0x05, + 0x18, 0x05, 0x19, 0x05, 0x1a, 0x05, 0x1b, 0x05, + 0x1c, 0x05, 0x1d, 0x05, 0x1e, 0x05, 0x1f, 0x05, + 0x20, 0x05, 0x21, 0x05, 0x22, 0x05, 0x23, 0x05, + 0x24, 0x05, 0x25, 0x05, 0x26, 0x05, 0x27, 0x05, + 0x28, 0x05, 0x29, 0x05, 0x2a, 0x05, 0x2b, 0x05, + 0x2c, 0x05, 0x2d, 0x05, 0x2e, 0x05, 0x2f, 0x05, + 0x30, 0x05, 0x31, 0x05, 0x32, 0x05, 0x33, 0x05, + 0x34, 0x05, 0x35, 0x05, 0x36, 0x05, 0x37, 0x05, + 0x38, 0x05, 0x39, 0x05, 0x3a, 0x05, 0x3b, 0x05, + 0x3c, 0x05, 0x3d, 0x05, 0x3e, 0x05, 0x3f, 0x05, + 0x40, 0x05, 0x41, 0x05, 0x42, 0x05, 0x43, 0x05, + 0x44, 0x05, 0x45, 0x05, 0x46, 0x05, 0x47, 0x05, + 0x48, 0x05, 0x49, 0x05, 0x4a, 0x05, 0x4b, 0x05, + 0x4c, 0x05, 0x4d, 0x05, 0x4e, 0x05, 0x4f, 0x05, + 0x50, 0x05, 0x51, 0x05, 0x52, 0x05, 0x53, 0x05, + 0x54, 0x05, 0x55, 0x05, 0x56, 0x05, 0x57, 0x05, + 0x58, 0x05, 0x59, 0x05, 0x5a, 0x05, 0x5b, 0x05, + 0x5c, 0x05, 0x5d, 0x05, 0x5e, 0x05, 0x5f, 0x05, + 0x60, 0x05, 0x31, 0x05, 0x32, 0x05, 0x33, 0x05, + 0x34, 0x05, 0x35, 0x05, 0x36, 0x05, 0x37, 0x05, + 0x38, 0x05, 0x39, 0x05, 0x3a, 0x05, 0x3b, 0x05, + 0x3c, 0x05, 0x3d, 0x05, 0x3e, 0x05, 0x3f, 0x05, + 0x40, 0x05, 0x41, 0x05, 0x42, 0x05, 0x43, 0x05, + 0x44, 0x05, 0x45, 0x05, 0x46, 0x05, 0x47, 0x05, + 0x48, 0x05, 0x49, 0x05, 0x4a, 0x05, 0x4b, 0x05, + 0x4c, 0x05, 0x4d, 0x05, 0x4e, 0x05, 0x4f, 0x05, + 0x50, 0x05, 0x51, 0x05, 0x52, 0x05, 0x53, 0x05, + 0x54, 0x05, 0x55, 0x05, 0x56, 0x05, 0xff, 0xff, + 0xf6, 0x17, 0x63, 0x2c, 0x7e, 0x1d, 0x7f, 0x1d, + 0x80, 0x1d, 0x81, 0x1d, 0x82, 0x1d, 0x83, 0x1d, + 0x84, 0x1d, 0x85, 0x1d, 0x86, 0x1d, 0x87, 0x1d, + 0x88, 0x1d, 0x89, 0x1d, 0x8a, 0x1d, 0x8b, 0x1d, + 0x8c, 0x1d, 0x8d, 0x1d, 0x8e, 0x1d, 0x8f, 0x1d, + 0x90, 0x1d, 0x91, 0x1d, 0x92, 0x1d, 0x93, 0x1d, + 0x94, 0x1d, 0x95, 0x1d, 0x96, 0x1d, 0x97, 0x1d, + 0x98, 0x1d, 0x99, 0x1d, 0x9a, 0x1d, 0x9b, 0x1d, + 0x9c, 0x1d, 0x9d, 0x1d, 0x9e, 0x1d, 0x9f, 0x1d, + 0xa0, 0x1d, 0xa1, 0x1d, 0xa2, 0x1d, 0xa3, 0x1d, + 0xa4, 0x1d, 0xa5, 0x1d, 0xa6, 0x1d, 0xa7, 0x1d, + 0xa8, 0x1d, 0xa9, 0x1d, 0xaa, 0x1d, 0xab, 0x1d, + 0xac, 0x1d, 0xad, 0x1d, 0xae, 0x1d, 0xaf, 0x1d, + 0xb0, 0x1d, 0xb1, 0x1d, 0xb2, 0x1d, 0xb3, 0x1d, + 0xb4, 0x1d, 0xb5, 0x1d, 0xb6, 0x1d, 0xb7, 0x1d, + 0xb8, 0x1d, 0xb9, 0x1d, 0xba, 0x1d, 0xbb, 0x1d, + 0xbc, 0x1d, 0xbd, 0x1d, 0xbe, 0x1d, 0xbf, 0x1d, + 0xc0, 0x1d, 0xc1, 0x1d, 0xc2, 0x1d, 0xc3, 0x1d, + 0xc4, 0x1d, 0xc5, 0x1d, 0xc6, 0x1d, 0xc7, 0x1d, + 0xc8, 0x1d, 0xc9, 0x1d, 0xca, 0x1d, 0xcb, 0x1d, + 0xcc, 0x1d, 0xcd, 0x1d, 0xce, 0x1d, 0xcf, 0x1d, + 0xd0, 0x1d, 0xd1, 0x1d, 0xd2, 0x1d, 0xd3, 0x1d, + 0xd4, 0x1d, 0xd5, 0x1d, 0xd6, 0x1d, 0xd7, 0x1d, + 0xd8, 0x1d, 0xd9, 0x1d, 0xda, 0x1d, 0xdb, 0x1d, + 0xdc, 0x1d, 0xdd, 0x1d, 0xde, 0x1d, 0xdf, 0x1d, + 0xe0, 0x1d, 0xe1, 0x1d, 0xe2, 0x1d, 0xe3, 0x1d, + 0xe4, 0x1d, 0xe5, 0x1d, 0xe6, 0x1d, 0xe7, 0x1d, + 0xe8, 0x1d, 0xe9, 0x1d, 0xea, 0x1d, 0xeb, 0x1d, + 0xec, 0x1d, 0xed, 0x1d, 0xee, 0x1d, 0xef, 0x1d, + 0xf0, 0x1d, 0xf1, 0x1d, 0xf2, 0x1d, 0xf3, 0x1d, + 0xf4, 0x1d, 0xf5, 0x1d, 0xf6, 0x1d, 0xf7, 0x1d, + 0xf8, 0x1d, 0xf9, 0x1d, 0xfa, 0x1d, 0xfb, 0x1d, + 0xfc, 0x1d, 0xfd, 0x1d, 0xfe, 0x1d, 0xff, 0x1d, + 0x00, 0x1e, 0x00, 0x1e, 0x02, 0x1e, 0x02, 0x1e, + 0x04, 0x1e, 0x04, 0x1e, 0x06, 0x1e, 0x06, 0x1e, + 0x08, 0x1e, 0x08, 0x1e, 0x0a, 0x1e, 0x0a, 0x1e, + 0x0c, 0x1e, 0x0c, 0x1e, 0x0e, 0x1e, 0x0e, 0x1e, + 0x10, 0x1e, 0x10, 0x1e, 0x12, 0x1e, 0x12, 0x1e, + 0x14, 0x1e, 0x14, 0x1e, 0x16, 0x1e, 0x16, 0x1e, + 0x18, 0x1e, 0x18, 0x1e, 0x1a, 0x1e, 0x1a, 0x1e, + 0x1c, 0x1e, 0x1c, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, + 0x20, 0x1e, 0x20, 0x1e, 0x22, 0x1e, 0x22, 0x1e, + 0x24, 0x1e, 0x24, 0x1e, 0x26, 0x1e, 0x26, 0x1e, + 0x28, 0x1e, 0x28, 0x1e, 0x2a, 0x1e, 0x2a, 0x1e, + 0x2c, 0x1e, 0x2c, 0x1e, 0x2e, 0x1e, 0x2e, 0x1e, + 0x30, 0x1e, 0x30, 0x1e, 0x32, 0x1e, 0x32, 0x1e, + 0x34, 0x1e, 0x34, 0x1e, 0x36, 0x1e, 0x36, 0x1e, + 0x38, 0x1e, 0x38, 0x1e, 0x3a, 0x1e, 0x3a, 0x1e, + 0x3c, 0x1e, 0x3c, 0x1e, 0x3e, 0x1e, 0x3e, 0x1e, + 0x40, 0x1e, 0x40, 0x1e, 0x42, 0x1e, 0x42, 0x1e, + 0x44, 0x1e, 0x44, 0x1e, 0x46, 0x1e, 0x46, 0x1e, + 0x48, 0x1e, 0x48, 0x1e, 0x4a, 0x1e, 0x4a, 0x1e, + 0x4c, 0x1e, 0x4c, 0x1e, 0x4e, 0x1e, 0x4e, 0x1e, + 0x50, 0x1e, 0x50, 0x1e, 0x52, 0x1e, 0x52, 0x1e, + 0x54, 0x1e, 0x54, 0x1e, 0x56, 0x1e, 0x56, 0x1e, + 0x58, 0x1e, 0x58, 0x1e, 0x5a, 0x1e, 0x5a, 0x1e, + 0x5c, 0x1e, 0x5c, 0x1e, 0x5e, 0x1e, 0x5e, 0x1e, + 0x60, 0x1e, 0x60, 0x1e, 0x62, 0x1e, 0x62, 0x1e, + 0x64, 0x1e, 0x64, 0x1e, 0x66, 0x1e, 0x66, 0x1e, + 0x68, 0x1e, 0x68, 0x1e, 0x6a, 0x1e, 0x6a, 0x1e, + 0x6c, 0x1e, 0x6c, 0x1e, 0x6e, 0x1e, 0x6e, 0x1e, + 0x70, 0x1e, 0x70, 0x1e, 0x72, 0x1e, 0x72, 0x1e, + 0x74, 0x1e, 0x74, 0x1e, 0x76, 0x1e, 0x76, 0x1e, + 0x78, 0x1e, 0x78, 0x1e, 0x7a, 0x1e, 0x7a, 0x1e, + 0x7c, 0x1e, 0x7c, 0x1e, 0x7e, 0x1e, 0x7e, 0x1e, + 0x80, 0x1e, 0x80, 0x1e, 0x82, 0x1e, 0x82, 0x1e, + 0x84, 0x1e, 0x84, 0x1e, 0x86, 0x1e, 0x86, 0x1e, + 0x88, 0x1e, 0x88, 0x1e, 0x8a, 0x1e, 0x8a, 0x1e, + 0x8c, 0x1e, 0x8c, 0x1e, 0x8e, 0x1e, 0x8e, 0x1e, + 0x90, 0x1e, 0x90, 0x1e, 0x92, 0x1e, 0x92, 0x1e, + 0x94, 0x1e, 0x94, 0x1e, 0x96, 0x1e, 0x97, 0x1e, + 0x98, 0x1e, 0x99, 0x1e, 0x9a, 0x1e, 0x9b, 0x1e, + 0x9c, 0x1e, 0x9d, 0x1e, 0x9e, 0x1e, 0x9f, 0x1e, + 0xa0, 0x1e, 0xa0, 0x1e, 0xa2, 0x1e, 0xa2, 0x1e, + 0xa4, 0x1e, 0xa4, 0x1e, 0xa6, 0x1e, 0xa6, 0x1e, + 0xa8, 0x1e, 0xa8, 0x1e, 0xaa, 0x1e, 0xaa, 0x1e, + 0xac, 0x1e, 0xac, 0x1e, 0xae, 0x1e, 0xae, 0x1e, + 0xb0, 0x1e, 0xb0, 0x1e, 0xb2, 0x1e, 0xb2, 0x1e, + 0xb4, 0x1e, 0xb4, 0x1e, 0xb6, 0x1e, 0xb6, 0x1e, + 0xb8, 0x1e, 0xb8, 0x1e, 0xba, 0x1e, 0xba, 0x1e, + 0xbc, 0x1e, 0xbc, 0x1e, 0xbe, 0x1e, 0xbe, 0x1e, + 0xc0, 0x1e, 0xc0, 0x1e, 0xc2, 0x1e, 0xc2, 0x1e, + 0xc4, 0x1e, 0xc4, 0x1e, 0xc6, 0x1e, 0xc6, 0x1e, + 0xc8, 0x1e, 0xc8, 0x1e, 0xca, 0x1e, 0xca, 0x1e, + 0xcc, 0x1e, 0xcc, 0x1e, 0xce, 0x1e, 0xce, 0x1e, + 0xd0, 0x1e, 0xd0, 0x1e, 0xd2, 0x1e, 0xd2, 0x1e, + 0xd4, 0x1e, 0xd4, 0x1e, 0xd6, 0x1e, 0xd6, 0x1e, + 0xd8, 0x1e, 0xd8, 0x1e, 0xda, 0x1e, 0xda, 0x1e, + 0xdc, 0x1e, 0xdc, 0x1e, 0xde, 0x1e, 0xde, 0x1e, + 0xe0, 0x1e, 0xe0, 0x1e, 0xe2, 0x1e, 0xe2, 0x1e, + 0xe4, 0x1e, 0xe4, 0x1e, 0xe6, 0x1e, 0xe6, 0x1e, + 0xe8, 0x1e, 0xe8, 0x1e, 0xea, 0x1e, 0xea, 0x1e, + 0xec, 0x1e, 0xec, 0x1e, 0xee, 0x1e, 0xee, 0x1e, + 0xf0, 0x1e, 0xf0, 0x1e, 0xf2, 0x1e, 0xf2, 0x1e, + 0xf4, 0x1e, 0xf4, 0x1e, 0xf6, 0x1e, 0xf6, 0x1e, + 0xf8, 0x1e, 0xf8, 0x1e, 0xfa, 0x1e, 0xfb, 0x1e, + 0xfc, 0x1e, 0xfd, 0x1e, 0xfe, 0x1e, 0xff, 0x1e, + 0x08, 0x1f, 0x09, 0x1f, 0x0a, 0x1f, 0x0b, 0x1f, + 0x0c, 0x1f, 0x0d, 0x1f, 0x0e, 0x1f, 0x0f, 0x1f, + 0x08, 0x1f, 0x09, 0x1f, 0x0a, 0x1f, 0x0b, 0x1f, + 0x0c, 0x1f, 0x0d, 0x1f, 0x0e, 0x1f, 0x0f, 0x1f, + 0x18, 0x1f, 0x19, 0x1f, 0x1a, 0x1f, 0x1b, 0x1f, + 0x1c, 0x1f, 0x1d, 0x1f, 0x16, 0x1f, 0x17, 0x1f, + 0x18, 0x1f, 0x19, 0x1f, 0x1a, 0x1f, 0x1b, 0x1f, + 0x1c, 0x1f, 0x1d, 0x1f, 0x1e, 0x1f, 0x1f, 0x1f, + 0x28, 0x1f, 0x29, 0x1f, 0x2a, 0x1f, 0x2b, 0x1f, + 0x2c, 0x1f, 0x2d, 0x1f, 0x2e, 0x1f, 0x2f, 0x1f, + 0x28, 0x1f, 0x29, 0x1f, 0x2a, 0x1f, 0x2b, 0x1f, + 0x2c, 0x1f, 0x2d, 0x1f, 0x2e, 0x1f, 0x2f, 0x1f, + 0x38, 0x1f, 0x39, 0x1f, 0x3a, 0x1f, 0x3b, 0x1f, + 0x3c, 0x1f, 0x3d, 0x1f, 0x3e, 0x1f, 0x3f, 0x1f, + 0x38, 0x1f, 0x39, 0x1f, 0x3a, 0x1f, 0x3b, 0x1f, + 0x3c, 0x1f, 0x3d, 0x1f, 0x3e, 0x1f, 0x3f, 0x1f, + 0x48, 0x1f, 0x49, 0x1f, 0x4a, 0x1f, 0x4b, 0x1f, + 0x4c, 0x1f, 0x4d, 0x1f, 0x46, 0x1f, 0x47, 0x1f, + 0x48, 0x1f, 0x49, 0x1f, 0x4a, 0x1f, 0x4b, 0x1f, + 0x4c, 0x1f, 0x4d, 0x1f, 0x4e, 0x1f, 0x4f, 0x1f, + 0x50, 0x1f, 0x59, 0x1f, 0x52, 0x1f, 0x5b, 0x1f, + 0x54, 0x1f, 0x5d, 0x1f, 0x56, 0x1f, 0x5f, 0x1f, + 0x58, 0x1f, 0x59, 0x1f, 0x5a, 0x1f, 0x5b, 0x1f, + 0x5c, 0x1f, 0x5d, 0x1f, 0x5e, 0x1f, 0x5f, 0x1f, + 0x68, 0x1f, 0x69, 0x1f, 0x6a, 0x1f, 0x6b, 0x1f, + 0x6c, 0x1f, 0x6d, 0x1f, 0x6e, 0x1f, 0x6f, 0x1f, + 0x68, 0x1f, 0x69, 0x1f, 0x6a, 0x1f, 0x6b, 0x1f, + 0x6c, 0x1f, 0x6d, 0x1f, 0x6e, 0x1f, 0x6f, 0x1f, + 0xba, 0x1f, 0xbb, 0x1f, 0xc8, 0x1f, 0xc9, 0x1f, + 0xca, 0x1f, 0xcb, 0x1f, 0xda, 0x1f, 0xdb, 0x1f, + 0xf8, 0x1f, 0xf9, 0x1f, 0xea, 0x1f, 0xeb, 0x1f, + 0xfa, 0x1f, 0xfb, 0x1f, 0x7e, 0x1f, 0x7f, 0x1f, + 0x88, 0x1f, 0x89, 0x1f, 0x8a, 0x1f, 0x8b, 0x1f, + 0x8c, 0x1f, 0x8d, 0x1f, 0x8e, 0x1f, 0x8f, 0x1f, + 0x88, 0x1f, 0x89, 0x1f, 0x8a, 0x1f, 0x8b, 0x1f, + 0x8c, 0x1f, 0x8d, 0x1f, 0x8e, 0x1f, 0x8f, 0x1f, + 0x98, 0x1f, 0x99, 0x1f, 0x9a, 0x1f, 0x9b, 0x1f, + 0x9c, 0x1f, 0x9d, 0x1f, 0x9e, 0x1f, 0x9f, 0x1f, + 0x98, 0x1f, 0x99, 0x1f, 0x9a, 0x1f, 0x9b, 0x1f, + 0x9c, 0x1f, 0x9d, 0x1f, 0x9e, 0x1f, 0x9f, 0x1f, + 0xa8, 0x1f, 0xa9, 0x1f, 0xaa, 0x1f, 0xab, 0x1f, + 0xac, 0x1f, 0xad, 0x1f, 0xae, 0x1f, 0xaf, 0x1f, + 0xa8, 0x1f, 0xa9, 0x1f, 0xaa, 0x1f, 0xab, 0x1f, + 0xac, 0x1f, 0xad, 0x1f, 0xae, 0x1f, 0xaf, 0x1f, + 0xb8, 0x1f, 0xb9, 0x1f, 0xb2, 0x1f, 0xbc, 0x1f, + 0xb4, 0x1f, 0xb5, 0x1f, 0xb6, 0x1f, 0xb7, 0x1f, + 0xb8, 0x1f, 0xb9, 0x1f, 0xba, 0x1f, 0xbb, 0x1f, + 0xbc, 0x1f, 0xbd, 0x1f, 0xbe, 0x1f, 0xbf, 0x1f, + 0xc0, 0x1f, 0xc1, 0x1f, 0xc2, 0x1f, 0xc3, 0x1f, + 0xc4, 0x1f, 0xc5, 0x1f, 0xc6, 0x1f, 0xc7, 0x1f, + 0xc8, 0x1f, 0xc9, 0x1f, 0xca, 0x1f, 0xcb, 0x1f, + 0xc3, 0x1f, 0xcd, 0x1f, 0xce, 0x1f, 0xcf, 0x1f, + 0xd8, 0x1f, 0xd9, 0x1f, 0xd2, 0x1f, 0xd3, 0x1f, + 0xd4, 0x1f, 0xd5, 0x1f, 0xd6, 0x1f, 0xd7, 0x1f, + 0xd8, 0x1f, 0xd9, 0x1f, 0xda, 0x1f, 0xdb, 0x1f, + 0xdc, 0x1f, 0xdd, 0x1f, 0xde, 0x1f, 0xdf, 0x1f, + 0xe8, 0x1f, 0xe9, 0x1f, 0xe2, 0x1f, 0xe3, 0x1f, + 0xe4, 0x1f, 0xec, 0x1f, 0xe6, 0x1f, 0xe7, 0x1f, + 0xe8, 0x1f, 0xe9, 0x1f, 0xea, 0x1f, 0xeb, 0x1f, + 0xec, 0x1f, 0xed, 0x1f, 0xee, 0x1f, 0xef, 0x1f, + 0xf0, 0x1f, 0xf1, 0x1f, 0xf2, 0x1f, 0xf3, 0x1f, + 0xf4, 0x1f, 0xf5, 0x1f, 0xf6, 0x1f, 0xf7, 0x1f, + 0xf8, 0x1f, 0xf9, 0x1f, 0xfa, 0x1f, 0xfb, 0x1f, + 0xf3, 0x1f, 0xfd, 0x1f, 0xfe, 0x1f, 0xff, 0x1f, + 0x00, 0x20, 0x01, 0x20, 0x02, 0x20, 0x03, 0x20, + 0x04, 0x20, 0x05, 0x20, 0x06, 0x20, 0x07, 0x20, + 0x08, 0x20, 0x09, 0x20, 0x0a, 0x20, 0x0b, 0x20, + 0x0c, 0x20, 0x0d, 0x20, 0x0e, 0x20, 0x0f, 0x20, + 0x10, 0x20, 0x11, 0x20, 0x12, 0x20, 0x13, 0x20, + 0x14, 0x20, 0x15, 0x20, 0x16, 0x20, 0x17, 0x20, + 0x18, 0x20, 0x19, 0x20, 0x1a, 0x20, 0x1b, 0x20, + 0x1c, 0x20, 0x1d, 0x20, 0x1e, 0x20, 0x1f, 0x20, + 0x20, 0x20, 0x21, 0x20, 0x22, 0x20, 0x23, 0x20, + 0x24, 0x20, 0x25, 0x20, 0x26, 0x20, 0x27, 0x20, + 0x28, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x2b, 0x20, + 0x2c, 0x20, 0x2d, 0x20, 0x2e, 0x20, 0x2f, 0x20, + 0x30, 0x20, 0x31, 0x20, 0x32, 0x20, 0x33, 0x20, + 0x34, 0x20, 0x35, 0x20, 0x36, 0x20, 0x37, 0x20, + 0x38, 0x20, 0x39, 0x20, 0x3a, 0x20, 0x3b, 0x20, + 0x3c, 0x20, 0x3d, 0x20, 0x3e, 0x20, 0x3f, 0x20, + 0x40, 0x20, 0x41, 0x20, 0x42, 0x20, 0x43, 0x20, + 0x44, 0x20, 0x45, 0x20, 0x46, 0x20, 0x47, 0x20, + 0x48, 0x20, 0x49, 0x20, 0x4a, 0x20, 0x4b, 0x20, + 0x4c, 0x20, 0x4d, 0x20, 0x4e, 0x20, 0x4f, 0x20, + 0x50, 0x20, 0x51, 0x20, 0x52, 0x20, 0x53, 0x20, + 0x54, 0x20, 0x55, 0x20, 0x56, 0x20, 0x57, 0x20, + 0x58, 0x20, 0x59, 0x20, 0x5a, 0x20, 0x5b, 0x20, + 0x5c, 0x20, 0x5d, 0x20, 0x5e, 0x20, 0x5f, 0x20, + 0x60, 0x20, 0x61, 0x20, 0x62, 0x20, 0x63, 0x20, + 0x64, 0x20, 0x65, 0x20, 0x66, 0x20, 0x67, 0x20, + 0x68, 0x20, 0x69, 0x20, 0x6a, 0x20, 0x6b, 0x20, + 0x6c, 0x20, 0x6d, 0x20, 0x6e, 0x20, 0x6f, 0x20, + 0x70, 0x20, 0x71, 0x20, 0x72, 0x20, 0x73, 0x20, + 0x74, 0x20, 0x75, 0x20, 0x76, 0x20, 0x77, 0x20, + 0x78, 0x20, 0x79, 0x20, 0x7a, 0x20, 0x7b, 0x20, + 0x7c, 0x20, 0x7d, 0x20, 0x7e, 0x20, 0x7f, 0x20, + 0x80, 0x20, 0x81, 0x20, 0x82, 0x20, 0x83, 0x20, + 0x84, 0x20, 0x85, 0x20, 0x86, 0x20, 0x87, 0x20, + 0x88, 0x20, 0x89, 0x20, 0x8a, 0x20, 0x8b, 0x20, + 0x8c, 0x20, 0x8d, 0x20, 0x8e, 0x20, 0x8f, 0x20, + 0x90, 0x20, 0x91, 0x20, 0x92, 0x20, 0x93, 0x20, + 0x94, 0x20, 0x95, 0x20, 0x96, 0x20, 0x97, 0x20, + 0x98, 0x20, 0x99, 0x20, 0x9a, 0x20, 0x9b, 0x20, + 0x9c, 0x20, 0x9d, 0x20, 0x9e, 0x20, 0x9f, 0x20, + 0xa0, 0x20, 0xa1, 0x20, 0xa2, 0x20, 0xa3, 0x20, + 0xa4, 0x20, 0xa5, 0x20, 0xa6, 0x20, 0xa7, 0x20, + 0xa8, 0x20, 0xa9, 0x20, 0xaa, 0x20, 0xab, 0x20, + 0xac, 0x20, 0xad, 0x20, 0xae, 0x20, 0xaf, 0x20, + 0xb0, 0x20, 0xb1, 0x20, 0xb2, 0x20, 0xb3, 0x20, + 0xb4, 0x20, 0xb5, 0x20, 0xb6, 0x20, 0xb7, 0x20, + 0xb8, 0x20, 0xb9, 0x20, 0xba, 0x20, 0xbb, 0x20, + 0xbc, 0x20, 0xbd, 0x20, 0xbe, 0x20, 0xbf, 0x20, + 0xc0, 0x20, 0xc1, 0x20, 0xc2, 0x20, 0xc3, 0x20, + 0xc4, 0x20, 0xc5, 0x20, 0xc6, 0x20, 0xc7, 0x20, + 0xc8, 0x20, 0xc9, 0x20, 0xca, 0x20, 0xcb, 0x20, + 0xcc, 0x20, 0xcd, 0x20, 0xce, 0x20, 0xcf, 0x20, + 0xd0, 0x20, 0xd1, 0x20, 0xd2, 0x20, 0xd3, 0x20, + 0xd4, 0x20, 0xd5, 0x20, 0xd6, 0x20, 0xd7, 0x20, + 0xd8, 0x20, 0xd9, 0x20, 0xda, 0x20, 0xdb, 0x20, + 0xdc, 0x20, 0xdd, 0x20, 0xde, 0x20, 0xdf, 0x20, + 0xe0, 0x20, 0xe1, 0x20, 0xe2, 0x20, 0xe3, 0x20, + 0xe4, 0x20, 0xe5, 0x20, 0xe6, 0x20, 0xe7, 0x20, + 0xe8, 0x20, 0xe9, 0x20, 0xea, 0x20, 0xeb, 0x20, + 0xec, 0x20, 0xed, 0x20, 0xee, 0x20, 0xef, 0x20, + 0xf0, 0x20, 0xf1, 0x20, 0xf2, 0x20, 0xf3, 0x20, + 0xf4, 0x20, 0xf5, 0x20, 0xf6, 0x20, 0xf7, 0x20, + 0xf8, 0x20, 0xf9, 0x20, 0xfa, 0x20, 0xfb, 0x20, + 0xfc, 0x20, 0xfd, 0x20, 0xfe, 0x20, 0xff, 0x20, + 0x00, 0x21, 0x01, 0x21, 0x02, 0x21, 0x03, 0x21, + 0x04, 0x21, 0x05, 0x21, 0x06, 0x21, 0x07, 0x21, + 0x08, 0x21, 0x09, 0x21, 0x0a, 0x21, 0x0b, 0x21, + 0x0c, 0x21, 0x0d, 0x21, 0x0e, 0x21, 0x0f, 0x21, + 0x10, 0x21, 0x11, 0x21, 0x12, 0x21, 0x13, 0x21, + 0x14, 0x21, 0x15, 0x21, 0x16, 0x21, 0x17, 0x21, + 0x18, 0x21, 0x19, 0x21, 0x1a, 0x21, 0x1b, 0x21, + 0x1c, 0x21, 0x1d, 0x21, 0x1e, 0x21, 0x1f, 0x21, + 0x20, 0x21, 0x21, 0x21, 0x22, 0x21, 0x23, 0x21, + 0x24, 0x21, 0x25, 0x21, 0x26, 0x21, 0x27, 0x21, + 0x28, 0x21, 0x29, 0x21, 0x2a, 0x21, 0x2b, 0x21, + 0x2c, 0x21, 0x2d, 0x21, 0x2e, 0x21, 0x2f, 0x21, + 0x30, 0x21, 0x31, 0x21, 0x32, 0x21, 0x33, 0x21, + 0x34, 0x21, 0x35, 0x21, 0x36, 0x21, 0x37, 0x21, + 0x38, 0x21, 0x39, 0x21, 0x3a, 0x21, 0x3b, 0x21, + 0x3c, 0x21, 0x3d, 0x21, 0x3e, 0x21, 0x3f, 0x21, + 0x40, 0x21, 0x41, 0x21, 0x42, 0x21, 0x43, 0x21, + 0x44, 0x21, 0x45, 0x21, 0x46, 0x21, 0x47, 0x21, + 0x48, 0x21, 0x49, 0x21, 0x4a, 0x21, 0x4b, 0x21, + 0x4c, 0x21, 0x4d, 0x21, 0x32, 0x21, 0x4f, 0x21, + 0x50, 0x21, 0x51, 0x21, 0x52, 0x21, 0x53, 0x21, + 0x54, 0x21, 0x55, 0x21, 0x56, 0x21, 0x57, 0x21, + 0x58, 0x21, 0x59, 0x21, 0x5a, 0x21, 0x5b, 0x21, + 0x5c, 0x21, 0x5d, 0x21, 0x5e, 0x21, 0x5f, 0x21, + 0x60, 0x21, 0x61, 0x21, 0x62, 0x21, 0x63, 0x21, + 0x64, 0x21, 0x65, 0x21, 0x66, 0x21, 0x67, 0x21, + 0x68, 0x21, 0x69, 0x21, 0x6a, 0x21, 0x6b, 0x21, + 0x6c, 0x21, 0x6d, 0x21, 0x6e, 0x21, 0x6f, 0x21, + 0x60, 0x21, 0x61, 0x21, 0x62, 0x21, 0x63, 0x21, + 0x64, 0x21, 0x65, 0x21, 0x66, 0x21, 0x67, 0x21, + 0x68, 0x21, 0x69, 0x21, 0x6a, 0x21, 0x6b, 0x21, + 0x6c, 0x21, 0x6d, 0x21, 0x6e, 0x21, 0x6f, 0x21, + 0x80, 0x21, 0x81, 0x21, 0x82, 0x21, 0x83, 0x21, + 0x83, 0x21, 0xff, 0xff, 0x4b, 0x03, 0xb6, 0x24, + 0xb7, 0x24, 0xb8, 0x24, 0xb9, 0x24, 0xba, 0x24, + 0xbb, 0x24, 0xbc, 0x24, 0xbd, 0x24, 0xbe, 0x24, + 0xbf, 0x24, 0xc0, 0x24, 0xc1, 0x24, 0xc2, 0x24, + 0xc3, 0x24, 0xc4, 0x24, 0xc5, 0x24, 0xc6, 0x24, + 0xc7, 0x24, 0xc8, 0x24, 0xc9, 0x24, 0xca, 0x24, + 0xcb, 0x24, 0xcc, 0x24, 0xcd, 0x24, 0xce, 0x24, + 0xcf, 0x24, 0xff, 0xff, 0x46, 0x07, 0x00, 0x2c, + 0x01, 0x2c, 0x02, 0x2c, 0x03, 0x2c, 0x04, 0x2c, + 0x05, 0x2c, 0x06, 0x2c, 0x07, 0x2c, 0x08, 0x2c, + 0x09, 0x2c, 0x0a, 0x2c, 0x0b, 0x2c, 0x0c, 0x2c, + 0x0d, 0x2c, 0x0e, 0x2c, 0x0f, 0x2c, 0x10, 0x2c, + 0x11, 0x2c, 0x12, 0x2c, 0x13, 0x2c, 0x14, 0x2c, + 0x15, 0x2c, 0x16, 0x2c, 0x17, 0x2c, 0x18, 0x2c, + 0x19, 0x2c, 0x1a, 0x2c, 0x1b, 0x2c, 0x1c, 0x2c, + 0x1d, 0x2c, 0x1e, 0x2c, 0x1f, 0x2c, 0x20, 0x2c, + 0x21, 0x2c, 0x22, 0x2c, 0x23, 0x2c, 0x24, 0x2c, + 0x25, 0x2c, 0x26, 0x2c, 0x27, 0x2c, 0x28, 0x2c, + 0x29, 0x2c, 0x2a, 0x2c, 0x2b, 0x2c, 0x2c, 0x2c, + 0x2d, 0x2c, 0x2e, 0x2c, 0x5f, 0x2c, 0x60, 0x2c, + 0x60, 0x2c, 0x62, 0x2c, 0x63, 0x2c, 0x64, 0x2c, + 0x65, 0x2c, 0x66, 0x2c, 0x67, 0x2c, 0x67, 0x2c, + 0x69, 0x2c, 0x69, 0x2c, 0x6b, 0x2c, 0x6b, 0x2c, + 0x6d, 0x2c, 0x6e, 0x2c, 0x6f, 0x2c, 0x70, 0x2c, + 0x71, 0x2c, 0x72, 0x2c, 0x73, 0x2c, 0x74, 0x2c, + 0x75, 0x2c, 0x75, 0x2c, 0x77, 0x2c, 0x78, 0x2c, + 0x79, 0x2c, 0x7a, 0x2c, 0x7b, 0x2c, 0x7c, 0x2c, + 0x7d, 0x2c, 0x7e, 0x2c, 0x7f, 0x2c, 0x80, 0x2c, + 0x80, 0x2c, 0x82, 0x2c, 0x82, 0x2c, 0x84, 0x2c, + 0x84, 0x2c, 0x86, 0x2c, 0x86, 0x2c, 0x88, 0x2c, + 0x88, 0x2c, 0x8a, 0x2c, 0x8a, 0x2c, 0x8c, 0x2c, + 0x8c, 0x2c, 0x8e, 0x2c, 0x8e, 0x2c, 0x90, 0x2c, + 0x90, 0x2c, 0x92, 0x2c, 0x92, 0x2c, 0x94, 0x2c, + 0x94, 0x2c, 0x96, 0x2c, 0x96, 0x2c, 0x98, 0x2c, + 0x98, 0x2c, 0x9a, 0x2c, 0x9a, 0x2c, 0x9c, 0x2c, + 0x9c, 0x2c, 0x9e, 0x2c, 0x9e, 0x2c, 0xa0, 0x2c, + 0xa0, 0x2c, 0xa2, 0x2c, 0xa2, 0x2c, 0xa4, 0x2c, + 0xa4, 0x2c, 0xa6, 0x2c, 0xa6, 0x2c, 0xa8, 0x2c, + 0xa8, 0x2c, 0xaa, 0x2c, 0xaa, 0x2c, 0xac, 0x2c, + 0xac, 0x2c, 0xae, 0x2c, 0xae, 0x2c, 0xb0, 0x2c, + 0xb0, 0x2c, 0xb2, 0x2c, 0xb2, 0x2c, 0xb4, 0x2c, + 0xb4, 0x2c, 0xb6, 0x2c, 0xb6, 0x2c, 0xb8, 0x2c, + 0xb8, 0x2c, 0xba, 0x2c, 0xba, 0x2c, 0xbc, 0x2c, + 0xbc, 0x2c, 0xbe, 0x2c, 0xbe, 0x2c, 0xc0, 0x2c, + 0xc0, 0x2c, 0xc2, 0x2c, 0xc2, 0x2c, 0xc4, 0x2c, + 0xc4, 0x2c, 0xc6, 0x2c, 0xc6, 0x2c, 0xc8, 0x2c, + 0xc8, 0x2c, 0xca, 0x2c, 0xca, 0x2c, 0xcc, 0x2c, + 0xcc, 0x2c, 0xce, 0x2c, 0xce, 0x2c, 0xd0, 0x2c, + 0xd0, 0x2c, 0xd2, 0x2c, 0xd2, 0x2c, 0xd4, 0x2c, + 0xd4, 0x2c, 0xd6, 0x2c, 0xd6, 0x2c, 0xd8, 0x2c, + 0xd8, 0x2c, 0xda, 0x2c, 0xda, 0x2c, 0xdc, 0x2c, + 0xdc, 0x2c, 0xde, 0x2c, 0xde, 0x2c, 0xe0, 0x2c, + 0xe0, 0x2c, 0xe2, 0x2c, 0xe2, 0x2c, 0xe4, 0x2c, + 0xe5, 0x2c, 0xe6, 0x2c, 0xe7, 0x2c, 0xe8, 0x2c, + 0xe9, 0x2c, 0xea, 0x2c, 0xeb, 0x2c, 0xec, 0x2c, + 0xed, 0x2c, 0xee, 0x2c, 0xef, 0x2c, 0xf0, 0x2c, + 0xf1, 0x2c, 0xf2, 0x2c, 0xf3, 0x2c, 0xf4, 0x2c, + 0xf5, 0x2c, 0xf6, 0x2c, 0xf7, 0x2c, 0xf8, 0x2c, + 0xf9, 0x2c, 0xfa, 0x2c, 0xfb, 0x2c, 0xfc, 0x2c, + 0xfd, 0x2c, 0xfe, 0x2c, 0xff, 0x2c, 0xa0, 0x10, + 0xa1, 0x10, 0xa2, 0x10, 0xa3, 0x10, 0xa4, 0x10, + 0xa5, 0x10, 0xa6, 0x10, 0xa7, 0x10, 0xa8, 0x10, + 0xa9, 0x10, 0xaa, 0x10, 0xab, 0x10, 0xac, 0x10, + 0xad, 0x10, 0xae, 0x10, 0xaf, 0x10, 0xb0, 0x10, + 0xb1, 0x10, 0xb2, 0x10, 0xb3, 0x10, 0xb4, 0x10, + 0xb5, 0x10, 0xb6, 0x10, 0xb7, 0x10, 0xb8, 0x10, + 0xb9, 0x10, 0xba, 0x10, 0xbb, 0x10, 0xbc, 0x10, + 0xbd, 0x10, 0xbe, 0x10, 0xbf, 0x10, 0xc0, 0x10, + 0xc1, 0x10, 0xc2, 0x10, 0xc3, 0x10, 0xc4, 0x10, + 0xc5, 0x10, 0xff, 0xff, 0x1b, 0xd2, 0x21, 0xff, + 0x22, 0xff, 0x23, 0xff, 0x24, 0xff, 0x25, 0xff, + 0x26, 0xff, 0x27, 0xff, 0x28, 0xff, 0x29, 0xff, + 0x2a, 0xff, 0x2b, 0xff, 0x2c, 0xff, 0x2d, 0xff, + 0x2e, 0xff, 0x2f, 0xff, 0x30, 0xff, 0x31, 0xff, + 0x32, 0xff, 0x33, 0xff, 0x34, 0xff, 0x35, 0xff, + 0x36, 0xff, 0x37, 0xff, 0x38, 0xff, 0x39, 0xff, + 0x3a, 0xff, 0x5b, 0xff, 0x5c, 0xff, 0x5d, 0xff, + 0x5e, 0xff, 0x5f, 0xff, 0x60, 0xff, 0x61, 0xff, + 0x62, 0xff, 0x63, 0xff, 0x64, 0xff, 0x65, 0xff, + 0x66, 0xff, 0x67, 0xff, 0x68, 0xff, 0x69, 0xff, + 0x6a, 0xff, 0x6b, 0xff, 0x6c, 0xff, 0x6d, 0xff, + 0x6e, 0xff, 0x6f, 0xff, 0x70, 0xff, 0x71, 0xff, + 0x72, 0xff, 0x73, 0xff, 0x74, 0xff, 0x75, 0xff, + 0x76, 0xff, 0x77, 0xff, 0x78, 0xff, 0x79, 0xff, + 0x7a, 0xff, 0x7b, 0xff, 0x7c, 0xff, 0x7d, 0xff, + 0x7e, 0xff, 0x7f, 0xff, 0x80, 0xff, 0x81, 0xff, + 0x82, 0xff, 0x83, 0xff, 0x84, 0xff, 0x85, 0xff, + 0x86, 0xff, 0x87, 0xff, 0x88, 0xff, 0x89, 0xff, + 0x8a, 0xff, 0x8b, 0xff, 0x8c, 0xff, 0x8d, 0xff, + 0x8e, 0xff, 0x8f, 0xff, 0x90, 0xff, 0x91, 0xff, + 0x92, 0xff, 0x93, 0xff, 0x94, 0xff, 0x95, 0xff, + 0x96, 0xff, 0x97, 0xff, 0x98, 0xff, 0x99, 0xff, + 0x9a, 0xff, 0x9b, 0xff, 0x9c, 0xff, 0x9d, 0xff, + 0x9e, 0xff, 0x9f, 0xff, 0xa0, 0xff, 0xa1, 0xff, + 0xa2, 0xff, 0xa3, 0xff, 0xa4, 0xff, 0xa5, 0xff, + 0xa6, 0xff, 0xa7, 0xff, 0xa8, 0xff, 0xa9, 0xff, + 0xaa, 0xff, 0xab, 0xff, 0xac, 0xff, 0xad, 0xff, + 0xae, 0xff, 0xaf, 0xff, 0xb0, 0xff, 0xb1, 0xff, + 0xb2, 0xff, 0xb3, 0xff, 0xb4, 0xff, 0xb5, 0xff, + 0xb6, 0xff, 0xb7, 0xff, 0xb8, 0xff, 0xb9, 0xff, + 0xba, 0xff, 0xbb, 0xff, 0xbc, 0xff, 0xbd, 0xff, + 0xbe, 0xff, 0xbf, 0xff, 0xc0, 0xff, 0xc1, 0xff, + 0xc2, 0xff, 0xc3, 0xff, 0xc4, 0xff, 0xc5, 0xff, + 0xc6, 0xff, 0xc7, 0xff, 0xc8, 0xff, 0xc9, 0xff, + 0xca, 0xff, 0xcb, 0xff, 0xcc, 0xff, 0xcd, 0xff, + 0xce, 0xff, 0xcf, 0xff, 0xd0, 0xff, 0xd1, 0xff, + 0xd2, 0xff, 0xd3, 0xff, 0xd4, 0xff, 0xd5, 0xff, + 0xd6, 0xff, 0xd7, 0xff, 0xd8, 0xff, 0xd9, 0xff, + 0xda, 0xff, 0xdb, 0xff, 0xdc, 0xff, 0xdd, 0xff, + 0xde, 0xff, 0xdf, 0xff, 0xe0, 0xff, 0xe1, 0xff, + 0xe2, 0xff, 0xe3, 0xff, 0xe4, 0xff, 0xe5, 0xff, + 0xe6, 0xff, 0xe7, 0xff, 0xe8, 0xff, 0xe9, 0xff, + 0xea, 0xff, 0xeb, 0xff, 0xec, 0xff, 0xed, 0xff, + 0xee, 0xff, 0xef, 0xff, 0xf0, 0xff, 0xf1, 0xff, + 0xf2, 0xff, 0xf3, 0xff, 0xf4, 0xff, 0xf5, 0xff, + 0xf6, 0xff, 0xf7, 0xff, 0xf8, 0xff, 0xf9, 0xff, + 0xfa, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfd, 0xff, + 0xfe, 0xff, 0xff, 0xff +}; diff --git a/src/gui/Lib/exfat/src/mkfs/uctc.h b/src/gui/Lib/exfat/src/mkfs/uctc.h new file mode 100644 index 0000000..bd5ebb2 --- /dev/null +++ b/src/gui/Lib/exfat/src/mkfs/uctc.h @@ -0,0 +1,30 @@ +/* + uctc.h (30.10.10) + Upper Case Table declaration. + + Free exFAT implementation. + Copyright (C) 2011-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef MKFS_UCTC_H_INCLUDED +#define MKFS_UCTC_H_INCLUDED + +#include + +extern uint8_t upcase_table[5836]; + +#endif /* ifndef MKFS_UCTC_H_INCLUDED */ diff --git a/src/gui/Lib/exfat/src/mkfs/vbr.c b/src/gui/Lib/exfat/src/mkfs/vbr.c new file mode 100644 index 0000000..e40081f --- /dev/null +++ b/src/gui/Lib/exfat/src/mkfs/vbr.c @@ -0,0 +1,148 @@ +/* + vbr.c (09.11.10) + Volume Boot Record creation code. + + Free exFAT implementation. + Copyright (C) 2011-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "vbr.h" +#include "fat.h" +#include "cbm.h" +#include "uct.h" +#include "rootdir.h" +#include + +static off_t vbr_alignment(void) +{ + return get_sector_size(); +} + +static off_t vbr_size(void) +{ + return 12 * get_sector_size(); +} + +static void init_sb(struct exfat_super_block* sb) +{ + uint32_t clusters_max; + uint32_t fat_sectors; + + clusters_max = get_volume_size() / get_cluster_size(); + fat_sectors = DIV_ROUND_UP((off_t) clusters_max * sizeof(cluster_t), + get_sector_size()); + + memset(sb, 0, sizeof(struct exfat_super_block)); + sb->jump[0] = 0xeb; + sb->jump[1] = 0x76; + sb->jump[2] = 0x90; + memcpy(sb->oem_name, "EXFAT ", sizeof(sb->oem_name)); + sb->sector_start = cpu_to_le64(get_first_sector()); + sb->sector_count = cpu_to_le64(get_volume_size() / get_sector_size()); + sb->fat_sector_start = cpu_to_le32( + fat.get_alignment() / get_sector_size()); + sb->fat_sector_count = cpu_to_le32(ROUND_UP( + le32_to_cpu(sb->fat_sector_start) + fat_sectors, + 1 << get_spc_bits()) - + le32_to_cpu(sb->fat_sector_start)); + sb->cluster_sector_start = cpu_to_le32( + get_position(&cbm) / get_sector_size()); + sb->cluster_count = cpu_to_le32(clusters_max - + ((le32_to_cpu(sb->fat_sector_start) + + le32_to_cpu(sb->fat_sector_count)) >> get_spc_bits())); + sb->rootdir_cluster = cpu_to_le32( + (get_position(&rootdir) - get_position(&cbm)) / get_cluster_size() + + EXFAT_FIRST_DATA_CLUSTER); + sb->volume_serial = cpu_to_le32(get_volume_serial()); + sb->version.major = 1; + sb->version.minor = 0; + sb->volume_state = cpu_to_le16(0); + sb->sector_bits = get_sector_bits(); + sb->spc_bits = get_spc_bits(); + sb->fat_count = 1; + sb->drive_no = 0x80; + sb->allocated_percent = 0; + sb->boot_signature = cpu_to_le16(0xaa55); +} + +static int vbr_write(struct exfat_dev* dev) +{ + struct exfat_super_block sb; + uint32_t checksum; + le32_t* sector = malloc(get_sector_size()); + size_t i; + + if (sector == NULL) + { + exfat_error("failed to allocate sector-sized block of memory"); + return 1; + } + + init_sb(&sb); + if (exfat_write(dev, &sb, sizeof(struct exfat_super_block)) < 0) + { + free(sector); + exfat_error("failed to write super block sector"); + return 1; + } + checksum = exfat_vbr_start_checksum(&sb, sizeof(struct exfat_super_block)); + + memset(sector, 0, get_sector_size()); + sector[get_sector_size() / sizeof(sector[0]) - 1] = + cpu_to_le32(0xaa550000); + for (i = 0; i < 8; i++) + { + if (exfat_write(dev, sector, get_sector_size()) < 0) + { + free(sector); + exfat_error("failed to write a sector with boot signature"); + return 1; + } + checksum = exfat_vbr_add_checksum(sector, get_sector_size(), checksum); + } + + memset(sector, 0, get_sector_size()); + for (i = 0; i < 2; i++) + { + if (exfat_write(dev, sector, get_sector_size()) < 0) + { + free(sector); + exfat_error("failed to write an empty sector"); + return 1; + } + checksum = exfat_vbr_add_checksum(sector, get_sector_size(), checksum); + } + + for (i = 0; i < get_sector_size() / sizeof(sector[0]); i++) + sector[i] = cpu_to_le32(checksum); + if (exfat_write(dev, sector, get_sector_size()) < 0) + { + free(sector); + exfat_error("failed to write checksum sector"); + return 1; + } + + free(sector); + return 0; +} + +const struct fs_object vbr = +{ + .get_alignment = vbr_alignment, + .get_size = vbr_size, + .write = vbr_write, +}; diff --git a/src/gui/Lib/exfat/src/mkfs/vbr.h b/src/gui/Lib/exfat/src/mkfs/vbr.h new file mode 100644 index 0000000..c1f59a6 --- /dev/null +++ b/src/gui/Lib/exfat/src/mkfs/vbr.h @@ -0,0 +1,30 @@ +/* + vbr.h (09.11.10) + Volume Boot Record creation code. + + Free exFAT implementation. + Copyright (C) 2011-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef MKFS_VBR_H_INCLUDED +#define MKFS_VBR_H_INCLUDED + +#include "mkexfat.h" + +extern const struct fs_object vbr; + +#endif /* ifndef MKFS_VBR_H_INCLUDED */ diff --git a/src/gui/Lib/fat_io_lib/API.txt b/src/gui/Lib/fat_io_lib/API.txt new file mode 100644 index 0000000..61fc164 --- /dev/null +++ b/src/gui/Lib/fat_io_lib/API.txt @@ -0,0 +1,22 @@ +File IO Lib API +-=-=-=-=-=-=-=-=- + +void fl_init(void) + + Called to initialize FAT IO library. + This should be called prior to any other functions. + +void fl_attach_locks(void (*lock)(void), void (*unlock)(void)) + + [Optional] File system thread safety locking functions. + For thread safe operation, you should provide lock() and unlock() functions. + Note that locking primitive used must support recursive locking, i.e lock() called within an already ‘locked’ region. + +int fl_attach_media(fn_diskio_read rd, fn_diskio_write wr) + + This function is used to attach system specific disk/media access functions. + This should be done subsequent to calling fl_init() and fl_attach_locks() (if locking required). + +void fl_shutdown(void) + + Shutdown the FAT IO library. This purges any un-saved data back to disk. diff --git a/src/gui/Lib/fat_io_lib/COPYRIGHT.txt b/src/gui/Lib/fat_io_lib/COPYRIGHT.txt new file mode 100644 index 0000000..4335f7f --- /dev/null +++ b/src/gui/Lib/fat_io_lib/COPYRIGHT.txt @@ -0,0 +1,345 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/src/gui/Lib/fat_io_lib/Configuration.txt b/src/gui/Lib/fat_io_lib/Configuration.txt new file mode 100644 index 0000000..9ec576e --- /dev/null +++ b/src/gui/Lib/fat_io_lib/Configuration.txt @@ -0,0 +1,53 @@ +File IO Lib Options +-=-=-=-=-=-=-=-=-=- + +See defines in fat_opts.h: + +FATFS_IS_LITTLE_ENDIAN [1/0] + Which endian is your system? Set to 1 for little endian, 0 for big endian. + +FATFS_MAX_LONG_FILENAME [260] + By default, 260 characters (max LFN length). Increase this to support greater path depths. + +FATFS_MAX_OPEN_FILES + The more files you wish to have concurrently open, the greater this number should be. + This increases the number of FL_FILE file structures in the library, each of these is around 1K in size (assuming 512 byte sectors). + +FAT_BUFFER_SECTORS + Minimum is 1, more increases performance. + This defines how many FAT sectors can be buffered per FAT_BUFFER entry. + +FAT_BUFFERS + Minimum is 1, more increases performance. + This defines how many FAT buffer entries are available. + Memory usage is FAT_BUFFERS * FAT_BUFFER_SECTORS * FAT_SECTOR_SIZE + +FATFS_INC_WRITE_SUPPORT + Support file write functionality. + +FAT_SECTOR_SIZE + Sector size used by buffers. Most likely to be 512 bytes (standard for ATA/IDE). + +FAT_PRINTF + A define that allows the File IO library to print to console/stdout. + Provide your own printf function if printf not available. + +FAT_CLUSTER_CACHE_ENTRIES + Size of cluster chain cache (can be undefined if not required). + Mem used = FAT_CLUSTER_CACHE_ENTRIES * 4 * 2 + Improves access speed considerably. + +FATFS_INC_LFN_SUPPORT [1/0] + Enable/Disable support for long filenames. + +FATFS_DIR_LIST_SUPPORT [1/0] + Include support for directory listing. + +FATFS_INC_TIME_DATE_SUPPORT [1/0] + Use time/date functions provided by time.h to update creation & modification timestamps. + +FATFS_INC_FORMAT_SUPPORT + Include support for formatting disks (FAT16 only). + +FAT_PRINTF_NOINC_STDIO + Disable use of printf & inclusion of stdio.h diff --git a/src/gui/Lib/fat_io_lib/History.txt b/src/gui/Lib/fat_io_lib/History.txt new file mode 100644 index 0000000..58958f4 --- /dev/null +++ b/src/gui/Lib/fat_io_lib/History.txt @@ -0,0 +1,24 @@ +Revision History +-=-=-=-=-=-=-=-=- +v2.6.11 - Fix compilation with GCC on 64-bit machines +v2.6.10 - Added support for FAT32 format. +V2.6.9 - Added support for time & date handling. +V2.6.8 - Fixed error with FSINFO sector write. +V2.6.7 - Added fgets(). + Fixed C warnings, removed dependancy on some string.h functions. +V2.6.6 – Massive read + write performance improvements. +V2.6.5 – Bug fixes for big endian systems. +V2.6.4 – Further bug fixes and performance improvements for write operations. +V2.6.3 – Peformance improvements, FAT16 formatting support. Various bug fixes. +V2.6 - Basic support for FAT16 added (18-04-10). +V2.5 - Code cleaned up. Many bugs fixed. Thread safety functions added. +V2.x - Write support added as well as better stdio like API. +V1.0 - Rewrite of all code to enable multiple files to be opened and provides a + better file API. + Also better string matching, and generally better C code than origonal + version. +V0.1c - Fetch_ID_Max_LBA() function added to retrieve Drive infomation and stoping + the drive reads from addressing a sector that is out of range. +V0.1b - fopen(), fgetc(), fopenDIR() using new software stack for IDE and FAT32 + access. +V0.1a - First release (27/12/03); fopen(), fgetc() unbuffered reads. diff --git a/src/gui/Lib/fat_io_lib/License.txt b/src/gui/Lib/fat_io_lib/License.txt new file mode 100644 index 0000000..c7fb0cc --- /dev/null +++ b/src/gui/Lib/fat_io_lib/License.txt @@ -0,0 +1,10 @@ +FAT File IO Library License +-=-=-=-=-=-=-=-=-=-=-=-=-=- + +This versions license: GPL + +If you include GPL software in your project, you must release the source code of that project too. + +If you would like a version with a more permissive license for use in closed source commercial applications please contact me for details. + +Email: admin@ultra-embedded.com diff --git a/src/gui/Lib/fat_io_lib/Media Access API.txt b/src/gui/Lib/fat_io_lib/Media Access API.txt new file mode 100644 index 0000000..45eede0 --- /dev/null +++ b/src/gui/Lib/fat_io_lib/Media Access API.txt @@ -0,0 +1,40 @@ +Media Access API +-=-=-=-=-=-=-=-=- + +int media_read(uint32 sector, uint8 *buffer, uint32 sector_count) + +Params: + Sector: 32-bit sector number + Buffer: Target buffer to read n sectors of data into. + Sector_count: Number of sectors to read. + +Return: + int, 1 = success, 0 = failure. + +Description: + Application/target specific disk/media read function. + Sector number (sectors are usually 512 byte pages) to read. + +Media Write API + +int media_write(uint32 sector, uint8 *buffer, uint32 sector_count) + +Params: + Sector: 32-bit sector number + Buffer: Target buffer to write n sectors of data from. + Sector_count: Number of sectors to write. + +Return: + int, 1 = success, 0 = failure. + +Description: + Application/target specific disk/media write function. + Sector number (sectors are usually 512 byte pages) to write to. + +File IO Library Linkage + Use the following API to attach the media IO functions to the File IO library. + + int fl_attach_media(fn_diskio_read rd, fn_diskio_write wr) + + + diff --git a/src/gui/Lib/fat_io_lib/fat_access.c b/src/gui/Lib/fat_io_lib/fat_access.c new file mode 100644 index 0000000..f55bd59 --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_access.c @@ -0,0 +1,904 @@ +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// FAT16/32 File IO Library +// V2.6 +// Ultra-Embedded.com +// Copyright 2003 - 2012 +// +// Email: admin@ultra-embedded.com +// +// License: GPL +// If you would like a version with a more permissive license for use in +// closed source commercial applications please contact me for details. +//----------------------------------------------------------------------------- +// +// This file is part of FAT File IO Library. +// +// FAT File IO Library is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// FAT File IO Library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with FAT File IO Library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#include +#include "fat_defs.h" +#include "fat_access.h" +#include "fat_table.h" +#include "fat_write.h" +#include "fat_string.h" +#include "fat_misc.h" + +//----------------------------------------------------------------------------- +// fatfs_init: Load FAT Parameters +//----------------------------------------------------------------------------- +int fatfs_init(struct fatfs *fs) +{ + uint8 num_of_fats; + uint16 reserved_sectors; + uint32 FATSz; + uint32 root_dir_sectors; + uint32 total_sectors; + uint32 data_sectors; + uint32 count_of_clusters; + uint8 valid_partition = 0; + + fs->currentsector.address = FAT32_INVALID_CLUSTER; + fs->currentsector.dirty = 0; + + fs->next_free_cluster = 0; // Invalid + + fatfs_fat_init(fs); + + // Make sure we have a read function (write function is optional) + if (!fs->disk_io.read_media) + return FAT_INIT_MEDIA_ACCESS_ERROR; + + // MBR: Sector 0 on the disk + // NOTE: Some removeable media does not have this. + + // Load MBR (LBA 0) into the 512 byte buffer + if (!fs->disk_io.read_media(0, fs->currentsector.sector, 1)) + return FAT_INIT_MEDIA_ACCESS_ERROR; + + // Make Sure 0x55 and 0xAA are at end of sector + // (this should be the case regardless of the MBR or boot sector) + if (fs->currentsector.sector[SIGNATURE_POSITION] != 0x55 || fs->currentsector.sector[SIGNATURE_POSITION+1] != 0xAA) + return FAT_INIT_INVALID_SIGNATURE; + + // Now check again using the access function to prove endian conversion function + if (GET_16BIT_WORD(fs->currentsector.sector, SIGNATURE_POSITION) != SIGNATURE_VALUE) + return FAT_INIT_ENDIAN_ERROR; + + // Verify packed structures + if (sizeof(struct fat_dir_entry) != FAT_DIR_ENTRY_SIZE) + return FAT_INIT_STRUCT_PACKING; + + // Check the partition type code + switch(fs->currentsector.sector[PARTITION1_TYPECODE_LOCATION]) + { + case 0x0B: + case 0x06: + case 0x0C: + case 0x0E: + case 0x0F: + case 0x05: + valid_partition = 1; + break; + case 0x00: + valid_partition = 0; + break; + default: + if (fs->currentsector.sector[PARTITION1_TYPECODE_LOCATION] <= 0x06) + valid_partition = 1; + break; + } + + // Read LBA Begin for the file system + if (valid_partition) + fs->lba_begin = GET_32BIT_WORD(fs->currentsector.sector, PARTITION1_LBA_BEGIN_LOCATION); + // Else possibly MBR less disk + else + fs->lba_begin = 0; + + // Load Volume 1 table into sector buffer + // (We may already have this in the buffer if MBR less drive!) + if (!fs->disk_io.read_media(fs->lba_begin, fs->currentsector.sector, 1)) + return FAT_INIT_MEDIA_ACCESS_ERROR; + + // Make sure there are 512 bytes per cluster + if (GET_16BIT_WORD(fs->currentsector.sector, 0x0B) != FAT_SECTOR_SIZE) + return FAT_INIT_INVALID_SECTOR_SIZE; + + // Load Parameters of FAT partition + fs->sectors_per_cluster = fs->currentsector.sector[BPB_SECPERCLUS]; + reserved_sectors = GET_16BIT_WORD(fs->currentsector.sector, BPB_RSVDSECCNT); + num_of_fats = fs->currentsector.sector[BPB_NUMFATS]; + fs->root_entry_count = GET_16BIT_WORD(fs->currentsector.sector, BPB_ROOTENTCNT); + + if(GET_16BIT_WORD(fs->currentsector.sector, BPB_FATSZ16) != 0) + fs->fat_sectors = GET_16BIT_WORD(fs->currentsector.sector, BPB_FATSZ16); + else + fs->fat_sectors = GET_32BIT_WORD(fs->currentsector.sector, BPB_FAT32_FATSZ32); + + // For FAT32 (which this may be) + fs->rootdir_first_cluster = GET_32BIT_WORD(fs->currentsector.sector, BPB_FAT32_ROOTCLUS); + fs->fs_info_sector = GET_16BIT_WORD(fs->currentsector.sector, BPB_FAT32_FSINFO); + + // For FAT16 (which this may be), rootdir_first_cluster is actuall rootdir_first_sector + fs->rootdir_first_sector = reserved_sectors + (num_of_fats * fs->fat_sectors); + fs->rootdir_sectors = ((fs->root_entry_count * 32) + (FAT_SECTOR_SIZE - 1)) / FAT_SECTOR_SIZE; + + // First FAT LBA address + fs->fat_begin_lba = fs->lba_begin + reserved_sectors; + + // The address of the first data cluster on this volume + fs->cluster_begin_lba = fs->fat_begin_lba + (num_of_fats * fs->fat_sectors); + + if (GET_16BIT_WORD(fs->currentsector.sector, 0x1FE) != 0xAA55) // This signature should be AA55 + return FAT_INIT_INVALID_SIGNATURE; + + // Calculate the root dir sectors + root_dir_sectors = ((GET_16BIT_WORD(fs->currentsector.sector, BPB_ROOTENTCNT) * 32) + (GET_16BIT_WORD(fs->currentsector.sector, BPB_BYTSPERSEC) - 1)) / GET_16BIT_WORD(fs->currentsector.sector, BPB_BYTSPERSEC); + + if(GET_16BIT_WORD(fs->currentsector.sector, BPB_FATSZ16) != 0) + FATSz = GET_16BIT_WORD(fs->currentsector.sector, BPB_FATSZ16); + else + FATSz = GET_32BIT_WORD(fs->currentsector.sector, BPB_FAT32_FATSZ32); + + if(GET_16BIT_WORD(fs->currentsector.sector, BPB_TOTSEC16) != 0) + total_sectors = GET_16BIT_WORD(fs->currentsector.sector, BPB_TOTSEC16); + else + total_sectors = GET_32BIT_WORD(fs->currentsector.sector, BPB_TOTSEC32); + + data_sectors = total_sectors - (GET_16BIT_WORD(fs->currentsector.sector, BPB_RSVDSECCNT) + (fs->currentsector.sector[BPB_NUMFATS] * FATSz) + root_dir_sectors); + + // Find out which version of FAT this is... + if (fs->sectors_per_cluster != 0) + { + count_of_clusters = data_sectors / fs->sectors_per_cluster; + + if(count_of_clusters < 4085) + // Volume is FAT12 + return FAT_INIT_WRONG_FILESYS_TYPE; + else if(count_of_clusters < 65525) + { + // Clear this FAT32 specific param + fs->rootdir_first_cluster = 0; + + // Volume is FAT16 + fs->fat_type = FAT_TYPE_16; + return FAT_INIT_OK; + } + else + { + // Volume is FAT32 + fs->fat_type = FAT_TYPE_32; + return FAT_INIT_OK; + } + } + else + return FAT_INIT_WRONG_FILESYS_TYPE; +} +//----------------------------------------------------------------------------- +// fatfs_lba_of_cluster: This function converts a cluster number into a sector / +// LBA number. +//----------------------------------------------------------------------------- +uint32 fatfs_lba_of_cluster(struct fatfs *fs, uint32 Cluster_Number) +{ + if (fs->fat_type == FAT_TYPE_16) + return (fs->cluster_begin_lba + (fs->root_entry_count * 32 / FAT_SECTOR_SIZE) + ((Cluster_Number-2) * fs->sectors_per_cluster)); + else + return ((fs->cluster_begin_lba + ((Cluster_Number-2)*fs->sectors_per_cluster))); +} +//----------------------------------------------------------------------------- +// fatfs_sector_read: +//----------------------------------------------------------------------------- +int fatfs_sector_read(struct fatfs *fs, uint32 lba, uint8 *target, uint32 count) +{ + return fs->disk_io.read_media(lba, target, count); +} +//----------------------------------------------------------------------------- +// fatfs_sector_write: +//----------------------------------------------------------------------------- +int fatfs_sector_write(struct fatfs *fs, uint32 lba, uint8 *target, uint32 count) +{ + return fs->disk_io.write_media(lba, target, count); +} +//----------------------------------------------------------------------------- +// fatfs_sector_reader: From the provided startcluster and sector offset +// Returns True if success, returns False if not (including if read out of range) +//----------------------------------------------------------------------------- +int fatfs_sector_reader(struct fatfs *fs, uint32 start_cluster, uint32 offset, uint8 *target) +{ + uint32 sector_to_read = 0; + uint32 cluster_to_read = 0; + uint32 cluster_chain = 0; + uint32 i; + uint32 lba; + + // FAT16 Root directory + if (fs->fat_type == FAT_TYPE_16 && start_cluster == 0) + { + if (offset < fs->rootdir_sectors) + lba = fs->lba_begin + fs->rootdir_first_sector + offset; + else + return 0; + } + // FAT16/32 Other + else + { + // Set start of cluster chain to initial value + cluster_chain = start_cluster; + + // Find parameters + cluster_to_read = offset / fs->sectors_per_cluster; + sector_to_read = offset - (cluster_to_read*fs->sectors_per_cluster); + + // Follow chain to find cluster to read + for (i=0; idisk_io.read_media(lba, target, 1); + // Else read sector if not already loaded + else if (lba != fs->currentsector.address) + { + fs->currentsector.address = lba; + return fs->disk_io.read_media(fs->currentsector.address, fs->currentsector.sector, 1); + } + else + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_read_sector: Read from the provided cluster and sector offset +// Returns True if success, returns False if not +//----------------------------------------------------------------------------- +int fatfs_read_sector(struct fatfs *fs, uint32 cluster, uint32 sector, uint8 *target) +{ + // FAT16 Root directory + if (fs->fat_type == FAT_TYPE_16 && cluster == 0) + { + uint32 lba; + + // In FAT16, there are a limited amount of sectors in root dir! + if (sector < fs->rootdir_sectors) + lba = fs->lba_begin + fs->rootdir_first_sector + sector; + else + return 0; + + // User target buffer passed in + if (target) + { + // Read from disk + return fs->disk_io.read_media(lba, target, 1); + } + else + { + // Calculate read address + fs->currentsector.address = lba; + + // Read from disk + return fs->disk_io.read_media(fs->currentsector.address, fs->currentsector.sector, 1); + } + } + // FAT16/32 Other + else + { + // User target buffer passed in + if (target) + { + // Calculate read address + uint32 lba = fatfs_lba_of_cluster(fs, cluster) + sector; + + // Read from disk + return fs->disk_io.read_media(lba, target, 1); + } + else + { + // Calculate write address + fs->currentsector.address = fatfs_lba_of_cluster(fs, cluster)+sector; + + // Read from disk + return fs->disk_io.read_media(fs->currentsector.address, fs->currentsector.sector, 1); + } + } +} +//----------------------------------------------------------------------------- +// fatfs_write_sector: Write to the provided cluster and sector offset +// Returns True if success, returns False if not +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fatfs_write_sector(struct fatfs *fs, uint32 cluster, uint32 sector, uint8 *target) +{ + // No write access? + if (!fs->disk_io.write_media) + return 0; + + // FAT16 Root directory + if (fs->fat_type == FAT_TYPE_16 && cluster == 0) + { + uint32 lba; + + // In FAT16 we cannot extend the root dir! + if (sector < fs->rootdir_sectors) + lba = fs->lba_begin + fs->rootdir_first_sector + sector; + else + return 0; + + // User target buffer passed in + if (target) + { + // Write to disk + return fs->disk_io.write_media(lba, target, 1); + } + else + { + // Calculate write address + fs->currentsector.address = lba; + + // Write to disk + return fs->disk_io.write_media(fs->currentsector.address, fs->currentsector.sector, 1); + } + } + // FAT16/32 Other + else + { + // User target buffer passed in + if (target) + { + // Calculate write address + uint32 lba = fatfs_lba_of_cluster(fs, cluster) + sector; + + // Write to disk + return fs->disk_io.write_media(lba, target, 1); + } + else + { + // Calculate write address + fs->currentsector.address = fatfs_lba_of_cluster(fs, cluster)+sector; + + // Write to disk + return fs->disk_io.write_media(fs->currentsector.address, fs->currentsector.sector, 1); + } + } +} +#endif +//----------------------------------------------------------------------------- +// fatfs_show_details: Show the details about the filesystem +//----------------------------------------------------------------------------- +void fatfs_show_details(struct fatfs *fs) +{ + FAT_PRINTF(("FAT details:\r\n")); + FAT_PRINTF((" Type =%s", (fs->fat_type == FAT_TYPE_32) ? "FAT32": "FAT16")); + FAT_PRINTF((" Root Dir First Cluster = %x\r\n", fs->rootdir_first_cluster)); + FAT_PRINTF((" FAT Begin LBA = 0x%x\r\n",fs->fat_begin_lba)); + FAT_PRINTF((" Cluster Begin LBA = 0x%x\r\n",fs->cluster_begin_lba)); + FAT_PRINTF((" Sectors Per Cluster = %d\r\n", fs->sectors_per_cluster)); +} +//----------------------------------------------------------------------------- +// fatfs_get_root_cluster: Get the root dir cluster +//----------------------------------------------------------------------------- +uint32 fatfs_get_root_cluster(struct fatfs *fs) +{ + // NOTE: On FAT16 this will be 0 which has a special meaning... + return fs->rootdir_first_cluster; +} +//------------------------------------------------------------- +// fatfs_get_file_entry: Find the file entry for a filename +//------------------------------------------------------------- +uint32 fatfs_get_file_entry(struct fatfs *fs, uint32 Cluster, char *name_to_find, struct fat_dir_entry *sfEntry) +{ + uint8 item=0; + uint16 recordoffset = 0; + uint8 i=0; + int x=0; + char *long_filename = NULL; + char short_filename[13]; + struct lfn_cache lfn; + int dotRequired = 0; + struct fat_dir_entry *directoryEntry; + + fatfs_lfn_cache_init(&lfn, 1); + + // Main cluster following loop + while (1) + { + // Read sector + if (fatfs_sector_reader(fs, Cluster, x++, 0)) // If sector read was successfull + { + // Analyse Sector + for (item = 0; item < FAT_DIR_ENTRIES_PER_SECTOR; item++) + { + // Create the multiplier for sector access + recordoffset = FAT_DIR_ENTRY_SIZE * item; + + // Overlay directory entry over buffer + directoryEntry = (struct fat_dir_entry*)(fs->currentsector.sector+recordoffset); + +#if FATFS_INC_LFN_SUPPORT + // Long File Name Text Found + if (fatfs_entry_lfn_text(directoryEntry) ) + fatfs_lfn_cache_entry(&lfn, fs->currentsector.sector+recordoffset); + + // If Invalid record found delete any long file name information collated + else if (fatfs_entry_lfn_invalid(directoryEntry) ) + fatfs_lfn_cache_init(&lfn, 0); + + // Normal SFN Entry and Long text exists + else if (fatfs_entry_lfn_exists(&lfn, directoryEntry) ) + { + long_filename = fatfs_lfn_cache_get(&lfn); + + // Compare names to see if they match + if (fatfs_compare_names(long_filename, name_to_find)) + { + memcpy(sfEntry,directoryEntry,sizeof(struct fat_dir_entry)); + return 1; + } + + fatfs_lfn_cache_init(&lfn, 0); + } + else +#endif + // Normal Entry, only 8.3 Text + if (fatfs_entry_sfn_only(directoryEntry) ) + { + memset(short_filename, 0, sizeof(short_filename)); + + // Copy name to string + for (i=0; i<8; i++) + short_filename[i] = directoryEntry->Name[i]; + + // Extension + dotRequired = 0; + for (i=8; i<11; i++) + { + short_filename[i+1] = directoryEntry->Name[i]; + if (directoryEntry->Name[i] != ' ') + dotRequired = 1; + } + + // Dot only required if extension present + if (dotRequired) + { + // If not . or .. entry + if (short_filename[0]!='.') + short_filename[8] = '.'; + else + short_filename[8] = ' '; + } + else + short_filename[8] = ' '; + + // Compare names to see if they match + if (fatfs_compare_names(short_filename, name_to_find)) + { + memcpy(sfEntry,directoryEntry,sizeof(struct fat_dir_entry)); + return 1; + } + + fatfs_lfn_cache_init(&lfn, 0); + } + } // End of if + } + else + break; + } // End of while loop + + return 0; +} +//------------------------------------------------------------- +// fatfs_sfn_exists: Check if a short filename exists. +// NOTE: shortname is XXXXXXXXYYY not XXXXXXXX.YYY +//------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fatfs_sfn_exists(struct fatfs *fs, uint32 Cluster, char *shortname) +{ + uint8 item=0; + uint16 recordoffset = 0; + int x=0; + struct fat_dir_entry *directoryEntry; + + // Main cluster following loop + while (1) + { + // Read sector + if (fatfs_sector_reader(fs, Cluster, x++, 0)) // If sector read was successfull + { + // Analyse Sector + for (item = 0; item < FAT_DIR_ENTRIES_PER_SECTOR; item++) + { + // Create the multiplier for sector access + recordoffset = FAT_DIR_ENTRY_SIZE * item; + + // Overlay directory entry over buffer + directoryEntry = (struct fat_dir_entry*)(fs->currentsector.sector+recordoffset); + +#if FATFS_INC_LFN_SUPPORT + // Long File Name Text Found + if (fatfs_entry_lfn_text(directoryEntry) ) + ; + + // If Invalid record found delete any long file name information collated + else if (fatfs_entry_lfn_invalid(directoryEntry) ) + ; + else +#endif + // Normal Entry, only 8.3 Text + if (fatfs_entry_sfn_only(directoryEntry) ) + { + if (strncmp((const char*)directoryEntry->Name, shortname, 11)==0) + return 1; + } + } // End of if + } + else + break; + } // End of while loop + + return 0; +} +#endif +//------------------------------------------------------------- +// fatfs_update_timestamps: Update date/time details +//------------------------------------------------------------- +#if FATFS_INC_TIME_DATE_SUPPORT +int fatfs_update_timestamps(struct fat_dir_entry *directoryEntry, int create, int modify, int access) +{ + time_t time_now; + struct tm * time_info; + uint16 fat_time; + uint16 fat_date; + + // Get system time + time(&time_now); + + // Convert to local time + time_info = localtime(&time_now); + + // Convert time to FAT format + fat_time = fatfs_convert_to_fat_time(time_info->tm_hour, time_info->tm_min, time_info->tm_sec); + + // Convert date to FAT format + fat_date = fatfs_convert_to_fat_date(time_info->tm_mday, time_info->tm_mon + 1, time_info->tm_year + 1900); + + // Update requested fields + if (create) + { + directoryEntry->CrtTime[1] = fat_time >> 8; + directoryEntry->CrtTime[0] = fat_time >> 0; + directoryEntry->CrtDate[1] = fat_date >> 8; + directoryEntry->CrtDate[0] = fat_date >> 0; + } + + if (modify) + { + directoryEntry->WrtTime[1] = fat_time >> 8; + directoryEntry->WrtTime[0] = fat_time >> 0; + directoryEntry->WrtDate[1] = fat_date >> 8; + directoryEntry->WrtDate[0] = fat_date >> 0; + } + + if (access) + { + directoryEntry->LstAccDate[1] = fat_time >> 8; + directoryEntry->LstAccDate[0] = fat_time >> 0; + directoryEntry->LstAccDate[1] = fat_date >> 8; + directoryEntry->LstAccDate[0] = fat_date >> 0; + } + + return 1; +} +#endif +//------------------------------------------------------------- +// fatfs_update_file_length: Find a SFN entry and update it +// NOTE: shortname is XXXXXXXXYYY not XXXXXXXX.YYY +//------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fatfs_update_file_length(struct fatfs *fs, uint32 Cluster, char *shortname, uint32 fileLength) +{ + uint8 item=0; + uint16 recordoffset = 0; + int x=0; + struct fat_dir_entry *directoryEntry; + + // No write access? + if (!fs->disk_io.write_media) + return 0; + + // Main cluster following loop + while (1) + { + // Read sector + if (fatfs_sector_reader(fs, Cluster, x++, 0)) // If sector read was successfull + { + // Analyse Sector + for (item = 0; item < FAT_DIR_ENTRIES_PER_SECTOR; item++) + { + // Create the multiplier for sector access + recordoffset = FAT_DIR_ENTRY_SIZE * item; + + // Overlay directory entry over buffer + directoryEntry = (struct fat_dir_entry*)(fs->currentsector.sector+recordoffset); + +#if FATFS_INC_LFN_SUPPORT + // Long File Name Text Found + if (fatfs_entry_lfn_text(directoryEntry) ) + ; + + // If Invalid record found delete any long file name information collated + else if (fatfs_entry_lfn_invalid(directoryEntry) ) + ; + + // Normal Entry, only 8.3 Text + else +#endif + if (fatfs_entry_sfn_only(directoryEntry) ) + { + if (strncmp((const char*)directoryEntry->Name, shortname, 11)==0) + { + directoryEntry->FileSize = FAT_HTONL(fileLength); + +#if FATFS_INC_TIME_DATE_SUPPORT + // Update access / modify time & date + fatfs_update_timestamps(directoryEntry, 0, 1, 1); +#endif + + // Update sfn entry + memcpy((uint8*)(fs->currentsector.sector+recordoffset), (uint8*)directoryEntry, sizeof(struct fat_dir_entry)); + + // Write sector back + return fs->disk_io.write_media(fs->currentsector.address, fs->currentsector.sector, 1); + } + } + } // End of if + } + else + break; + } // End of while loop + + return 0; +} +#endif +//------------------------------------------------------------- +// fatfs_mark_file_deleted: Find a SFN entry and mark if as deleted +// NOTE: shortname is XXXXXXXXYYY not XXXXXXXX.YYY +//------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fatfs_mark_file_deleted(struct fatfs *fs, uint32 Cluster, char *shortname) +{ + uint8 item=0; + uint16 recordoffset = 0; + int x=0; + struct fat_dir_entry *directoryEntry; + + // No write access? + if (!fs->disk_io.write_media) + return 0; + + // Main cluster following loop + while (1) + { + // Read sector + if (fatfs_sector_reader(fs, Cluster, x++, 0)) // If sector read was successfull + { + // Analyse Sector + for (item = 0; item < FAT_DIR_ENTRIES_PER_SECTOR; item++) + { + // Create the multiplier for sector access + recordoffset = FAT_DIR_ENTRY_SIZE * item; + + // Overlay directory entry over buffer + directoryEntry = (struct fat_dir_entry*)(fs->currentsector.sector+recordoffset); + +#if FATFS_INC_LFN_SUPPORT + // Long File Name Text Found + if (fatfs_entry_lfn_text(directoryEntry) ) + ; + + // If Invalid record found delete any long file name information collated + else if (fatfs_entry_lfn_invalid(directoryEntry) ) + ; + + // Normal Entry, only 8.3 Text + else +#endif + if (fatfs_entry_sfn_only(directoryEntry) ) + { + if (strncmp((const char *)directoryEntry->Name, shortname, 11)==0) + { + // Mark as deleted + directoryEntry->Name[0] = FILE_HEADER_DELETED; + +#if FATFS_INC_TIME_DATE_SUPPORT + // Update access / modify time & date + fatfs_update_timestamps(directoryEntry, 0, 1, 1); +#endif + + // Update sfn entry + memcpy((uint8*)(fs->currentsector.sector+recordoffset), (uint8*)directoryEntry, sizeof(struct fat_dir_entry)); + + // Write sector back + return fs->disk_io.write_media(fs->currentsector.address, fs->currentsector.sector, 1); + } + } + } // End of if + } + else + break; + } // End of while loop + + return 0; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_list_directory_start: Initialise a directory listing procedure +//----------------------------------------------------------------------------- +#if FATFS_DIR_LIST_SUPPORT +void fatfs_list_directory_start(struct fatfs *fs, struct fs_dir_list_status *dirls, uint32 StartCluster) +{ + dirls->cluster = StartCluster; + dirls->sector = 0; + dirls->offset = 0; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_list_directory_next: Get the next entry in the directory. +// Returns: 1 = found, 0 = end of listing +//----------------------------------------------------------------------------- +#if FATFS_DIR_LIST_SUPPORT +int fatfs_list_directory_next(struct fatfs *fs, struct fs_dir_list_status *dirls, struct fs_dir_ent *entry) +{ + uint8 i,item; + uint16 recordoffset; + struct fat_dir_entry *directoryEntry; + char *long_filename = NULL; + char short_filename[13]; + struct lfn_cache lfn; + int dotRequired = 0; + int result = 0; + + // Initialise LFN cache first + fatfs_lfn_cache_init(&lfn, 0); + + while (1) + { + // If data read OK + if (fatfs_sector_reader(fs, dirls->cluster, dirls->sector, 0)) + { + // Maximum of 16 directory entries + for (item = dirls->offset; item < FAT_DIR_ENTRIES_PER_SECTOR; item++) + { + // Increase directory offset + recordoffset = FAT_DIR_ENTRY_SIZE * item; + + // Overlay directory entry over buffer + directoryEntry = (struct fat_dir_entry*)(fs->currentsector.sector+recordoffset); + +#if FATFS_INC_LFN_SUPPORT + // Long File Name Text Found + if ( fatfs_entry_lfn_text(directoryEntry) ) + fatfs_lfn_cache_entry(&lfn, fs->currentsector.sector+recordoffset); + + // If Invalid record found delete any long file name information collated + else if ( fatfs_entry_lfn_invalid(directoryEntry) ) + fatfs_lfn_cache_init(&lfn, 0); + + // Normal SFN Entry and Long text exists + else if (fatfs_entry_lfn_exists(&lfn, directoryEntry) ) + { + // Get text + long_filename = fatfs_lfn_cache_get(&lfn); + strncpy(entry->filename, long_filename, FATFS_MAX_LONG_FILENAME-1); + + if (fatfs_entry_is_dir(directoryEntry)) + entry->is_dir = 1; + else + entry->is_dir = 0; + +#if FATFS_INC_TIME_DATE_SUPPORT + // Get time / dates + entry->create_time = ((uint16)directoryEntry->CrtTime[1] << 8) | directoryEntry->CrtTime[0]; + entry->create_date = ((uint16)directoryEntry->CrtDate[1] << 8) | directoryEntry->CrtDate[0]; + entry->access_date = ((uint16)directoryEntry->LstAccDate[1] << 8) | directoryEntry->LstAccDate[0]; + entry->write_time = ((uint16)directoryEntry->WrtTime[1] << 8) | directoryEntry->WrtTime[0]; + entry->write_date = ((uint16)directoryEntry->WrtDate[1] << 8) | directoryEntry->WrtDate[0]; +#endif + + entry->size = FAT_HTONL(directoryEntry->FileSize); + entry->cluster = (FAT_HTONS(directoryEntry->FstClusHI)<<16) | FAT_HTONS(directoryEntry->FstClusLO); + + // Next starting position + dirls->offset = item + 1; + result = 1; + return 1; + } + // Normal Entry, only 8.3 Text + else +#endif + if ( fatfs_entry_sfn_only(directoryEntry) ) + { + fatfs_lfn_cache_init(&lfn, 0); + + memset(short_filename, 0, sizeof(short_filename)); + + // Copy name to string + for (i=0; i<8; i++) + short_filename[i] = directoryEntry->Name[i]; + + // Extension + dotRequired = 0; + for (i=8; i<11; i++) + { + short_filename[i+1] = directoryEntry->Name[i]; + if (directoryEntry->Name[i] != ' ') + dotRequired = 1; + } + + // Dot only required if extension present + if (dotRequired) + { + // If not . or .. entry + if (short_filename[0]!='.') + short_filename[8] = '.'; + else + short_filename[8] = ' '; + } + else + short_filename[8] = ' '; + + fatfs_get_sfn_display_name(entry->filename, short_filename); + + if (fatfs_entry_is_dir(directoryEntry)) + entry->is_dir = 1; + else + entry->is_dir = 0; + +#if FATFS_INC_TIME_DATE_SUPPORT + // Get time / dates + entry->create_time = ((uint16)directoryEntry->CrtTime[1] << 8) | directoryEntry->CrtTime[0]; + entry->create_date = ((uint16)directoryEntry->CrtDate[1] << 8) | directoryEntry->CrtDate[0]; + entry->access_date = ((uint16)directoryEntry->LstAccDate[1] << 8) | directoryEntry->LstAccDate[0]; + entry->write_time = ((uint16)directoryEntry->WrtTime[1] << 8) | directoryEntry->WrtTime[0]; + entry->write_date = ((uint16)directoryEntry->WrtDate[1] << 8) | directoryEntry->WrtDate[0]; +#endif + + entry->size = FAT_HTONL(directoryEntry->FileSize); + entry->cluster = (FAT_HTONS(directoryEntry->FstClusHI)<<16) | FAT_HTONS(directoryEntry->FstClusLO); + + // Next starting position + dirls->offset = item + 1; + result = 1; + return 1; + } + }// end of for + + // If reached end of the dir move onto next sector + dirls->sector++; + dirls->offset = 0; + } + else + break; + } + + return result; +} +#endif diff --git a/src/gui/Lib/fat_io_lib/fat_access.h b/src/gui/Lib/fat_io_lib/fat_access.h new file mode 100644 index 0000000..1752387 --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_access.h @@ -0,0 +1,133 @@ +#ifndef __FAT_ACCESS_H__ +#define __FAT_ACCESS_H__ + +#include "fat_defs.h" +#include "fat_opts.h" + +//----------------------------------------------------------------------------- +// Defines +//----------------------------------------------------------------------------- +#define FAT_INIT_OK 0 +#define FAT_INIT_MEDIA_ACCESS_ERROR (-1) +#define FAT_INIT_INVALID_SECTOR_SIZE (-2) +#define FAT_INIT_INVALID_SIGNATURE (-3) +#define FAT_INIT_ENDIAN_ERROR (-4) +#define FAT_INIT_WRONG_FILESYS_TYPE (-5) +#define FAT_INIT_WRONG_PARTITION_TYPE (-6) +#define FAT_INIT_STRUCT_PACKING (-7) + +#define FAT_DIR_ENTRIES_PER_SECTOR (FAT_SECTOR_SIZE / FAT_DIR_ENTRY_SIZE) + +//----------------------------------------------------------------------------- +// Function Pointers +//----------------------------------------------------------------------------- +typedef int (*fn_diskio_read) (uint32 sector, uint8 *buffer, uint32 sector_count); +typedef int (*fn_diskio_write)(uint32 sector, uint8 *buffer, uint32 sector_count); + +//----------------------------------------------------------------------------- +// Structures +//----------------------------------------------------------------------------- +struct disk_if +{ + // User supplied function pointers for disk IO + fn_diskio_read read_media; + fn_diskio_write write_media; +}; + +// Forward declaration +struct fat_buffer; + +struct fat_buffer +{ + uint8 sector[FAT_SECTOR_SIZE * FAT_BUFFER_SECTORS]; + uint32 address; + int dirty; + uint8 * ptr; + + // Next in chain of sector buffers + struct fat_buffer *next; +}; + +typedef enum eFatType +{ + FAT_TYPE_16, + FAT_TYPE_32 +} tFatType; + +struct fatfs +{ + // Filesystem globals + uint8 sectors_per_cluster; + uint32 cluster_begin_lba; + uint32 rootdir_first_cluster; + uint32 rootdir_first_sector; + uint32 rootdir_sectors; + uint32 fat_begin_lba; + uint16 fs_info_sector; + uint32 lba_begin; + uint32 fat_sectors; + uint32 next_free_cluster; + uint16 root_entry_count; + uint16 reserved_sectors; + uint8 num_of_fats; + tFatType fat_type; + + // Disk/Media API + struct disk_if disk_io; + + // [Optional] Thread Safety + void (*fl_lock)(void); + void (*fl_unlock)(void); + + // Working buffer + struct fat_buffer currentsector; + + // FAT Buffer + struct fat_buffer *fat_buffer_head; + struct fat_buffer fat_buffers[FAT_BUFFERS]; +}; + +struct fs_dir_list_status +{ + uint32 sector; + uint32 cluster; + uint8 offset; +}; + +struct fs_dir_ent +{ + char filename[FATFS_MAX_LONG_FILENAME]; + uint8 is_dir; + uint32 cluster; + uint32 size; + +#if FATFS_INC_TIME_DATE_SUPPORT + uint16 access_date; + uint16 write_time; + uint16 write_date; + uint16 create_date; + uint16 create_time; +#endif +}; + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- +int fatfs_init(struct fatfs *fs); +uint32 fatfs_lba_of_cluster(struct fatfs *fs, uint32 Cluster_Number); +int fatfs_sector_reader(struct fatfs *fs, uint32 Startcluster, uint32 offset, uint8 *target); +int fatfs_sector_read(struct fatfs *fs, uint32 lba, uint8 *target, uint32 count); +int fatfs_sector_write(struct fatfs *fs, uint32 lba, uint8 *target, uint32 count); +int fatfs_read_sector(struct fatfs *fs, uint32 cluster, uint32 sector, uint8 *target); +int fatfs_write_sector(struct fatfs *fs, uint32 cluster, uint32 sector, uint8 *target); +void fatfs_show_details(struct fatfs *fs); +uint32 fatfs_get_root_cluster(struct fatfs *fs); +uint32 fatfs_get_file_entry(struct fatfs *fs, uint32 Cluster, char *nametofind, struct fat_dir_entry *sfEntry); +int fatfs_sfn_exists(struct fatfs *fs, uint32 Cluster, char *shortname); +int fatfs_update_file_length(struct fatfs *fs, uint32 Cluster, char *shortname, uint32 fileLength); +int fatfs_mark_file_deleted(struct fatfs *fs, uint32 Cluster, char *shortname); +void fatfs_list_directory_start(struct fatfs *fs, struct fs_dir_list_status *dirls, uint32 StartCluster); +int fatfs_list_directory_next(struct fatfs *fs, struct fs_dir_list_status *dirls, struct fs_dir_ent *entry); +int fatfs_update_timestamps(struct fat_dir_entry *directoryEntry, int create, int modify, int access); + +#endif diff --git a/src/gui/Lib/fat_io_lib/fat_cache.c b/src/gui/Lib/fat_io_lib/fat_cache.c new file mode 100644 index 0000000..de77e6a --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_cache.c @@ -0,0 +1,91 @@ +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// FAT16/32 File IO Library +// V2.6 +// Ultra-Embedded.com +// Copyright 2003 - 2012 +// +// Email: admin@ultra-embedded.com +// +// License: GPL +// If you would like a version with a more permissive license for use in +// closed source commercial applications please contact me for details. +//----------------------------------------------------------------------------- +// +// This file is part of FAT File IO Library. +// +// FAT File IO Library is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// FAT File IO Library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with FAT File IO Library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#include +#include "fat_cache.h" + +// Per file cluster chain caching used to improve performance. +// This does not have to be enabled for architectures with low +// memory space. + +//----------------------------------------------------------------------------- +// fatfs_cache_init: +//----------------------------------------------------------------------------- +int fatfs_cache_init(struct fatfs *fs, FL_FILE *file) +{ +#ifdef FAT_CLUSTER_CACHE_ENTRIES + int i; + + for (i=0;icluster_cache_idx[i] = 0xFFFFFFFF; // Not used + file->cluster_cache_data[i] = 0; + } +#endif + + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_cache_get_next_cluster: +//----------------------------------------------------------------------------- +int fatfs_cache_get_next_cluster(struct fatfs *fs, FL_FILE *file, uint32 clusterIdx, uint32 *pNextCluster) +{ +#ifdef FAT_CLUSTER_CACHE_ENTRIES + uint32 slot = clusterIdx % FAT_CLUSTER_CACHE_ENTRIES; + + if (file->cluster_cache_idx[slot] == clusterIdx) + { + *pNextCluster = file->cluster_cache_data[slot]; + return 1; + } +#endif + + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_cache_set_next_cluster: +//----------------------------------------------------------------------------- +int fatfs_cache_set_next_cluster(struct fatfs *fs, FL_FILE *file, uint32 clusterIdx, uint32 nextCluster) +{ +#ifdef FAT_CLUSTER_CACHE_ENTRIES + uint32 slot = clusterIdx % FAT_CLUSTER_CACHE_ENTRIES; + + if (file->cluster_cache_idx[slot] == clusterIdx) + file->cluster_cache_data[slot] = nextCluster; + else + { + file->cluster_cache_idx[slot] = clusterIdx; + file->cluster_cache_data[slot] = nextCluster; + } +#endif + + return 1; +} diff --git a/src/gui/Lib/fat_io_lib/fat_cache.h b/src/gui/Lib/fat_io_lib/fat_cache.h new file mode 100644 index 0000000..348d5d3 --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_cache.h @@ -0,0 +1,13 @@ +#ifndef __FAT_CACHE_H__ +#define __FAT_CACHE_H__ + +#include "fat_filelib.h" + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- +int fatfs_cache_init(struct fatfs *fs, FL_FILE *file); +int fatfs_cache_get_next_cluster(struct fatfs *fs, FL_FILE *file, uint32 clusterIdx, uint32 *pNextCluster); +int fatfs_cache_set_next_cluster(struct fatfs *fs, FL_FILE *file, uint32 clusterIdx, uint32 nextCluster); + +#endif diff --git a/src/gui/Lib/fat_io_lib/fat_defs.h b/src/gui/Lib/fat_io_lib/fat_defs.h new file mode 100644 index 0000000..5fe8d6a --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_defs.h @@ -0,0 +1,128 @@ +#ifndef __FAT_DEFS_H__ +#define __FAT_DEFS_H__ + +#include "fat_opts.h" +#include "fat_types.h" + +//----------------------------------------------------------------------------- +// FAT32 Offsets +// Name Offset +//----------------------------------------------------------------------------- + +// Boot Sector +#define BS_JMPBOOT 0 // Length = 3 +#define BS_OEMNAME 3 // Length = 8 +#define BPB_BYTSPERSEC 11 // Length = 2 +#define BPB_SECPERCLUS 13 // Length = 1 +#define BPB_RSVDSECCNT 14 // Length = 2 +#define BPB_NUMFATS 16 // Length = 1 +#define BPB_ROOTENTCNT 17 // Length = 2 +#define BPB_TOTSEC16 19 // Length = 2 +#define BPB_MEDIA 21 // Length = 1 +#define BPB_FATSZ16 22 // Length = 2 +#define BPB_SECPERTRK 24 // Length = 2 +#define BPB_NUMHEADS 26 // Length = 2 +#define BPB_HIDDSEC 28 // Length = 4 +#define BPB_TOTSEC32 32 // Length = 4 + +// FAT 12/16 +#define BS_FAT_DRVNUM 36 // Length = 1 +#define BS_FAT_BOOTSIG 38 // Length = 1 +#define BS_FAT_VOLID 39 // Length = 4 +#define BS_FAT_VOLLAB 43 // Length = 11 +#define BS_FAT_FILSYSTYPE 54 // Length = 8 + +// FAT 32 +#define BPB_FAT32_FATSZ32 36 // Length = 4 +#define BPB_FAT32_EXTFLAGS 40 // Length = 2 +#define BPB_FAT32_FSVER 42 // Length = 2 +#define BPB_FAT32_ROOTCLUS 44 // Length = 4 +#define BPB_FAT32_FSINFO 48 // Length = 2 +#define BPB_FAT32_BKBOOTSEC 50 // Length = 2 +#define BS_FAT32_DRVNUM 64 // Length = 1 +#define BS_FAT32_BOOTSIG 66 // Length = 1 +#define BS_FAT32_VOLID 67 // Length = 4 +#define BS_FAT32_VOLLAB 71 // Length = 11 +#define BS_FAT32_FILSYSTYPE 82 // Length = 8 + +//----------------------------------------------------------------------------- +// FAT Types +//----------------------------------------------------------------------------- +#define FAT_TYPE_FAT12 1 +#define FAT_TYPE_FAT16 2 +#define FAT_TYPE_FAT32 3 + +//----------------------------------------------------------------------------- +// FAT32 Specific Statics +//----------------------------------------------------------------------------- +#define SIGNATURE_POSITION 510 +#define SIGNATURE_VALUE 0xAA55 +#define PARTITION1_TYPECODE_LOCATION 450 +#define FAT32_TYPECODE1 0x0B +#define FAT32_TYPECODE2 0x0C +#define PARTITION1_LBA_BEGIN_LOCATION 454 +#define PARTITION1_SIZE_LOCATION 458 + +#define FAT_DIR_ENTRY_SIZE 32 +#define FAT_SFN_SIZE_FULL 11 +#define FAT_SFN_SIZE_PARTIAL 8 + +//----------------------------------------------------------------------------- +// FAT32 File Attributes and Types +//----------------------------------------------------------------------------- +#define FILE_ATTR_READ_ONLY 0x01 +#define FILE_ATTR_HIDDEN 0x02 +#define FILE_ATTR_SYSTEM 0x04 +#define FILE_ATTR_SYSHID 0x06 +#define FILE_ATTR_VOLUME_ID 0x08 +#define FILE_ATTR_DIRECTORY 0x10 +#define FILE_ATTR_ARCHIVE 0x20 +#define FILE_ATTR_LFN_TEXT 0x0F +#define FILE_HEADER_BLANK 0x00 +#define FILE_HEADER_DELETED 0xE5 +#define FILE_TYPE_DIR 0x10 +#define FILE_TYPE_FILE 0x20 + +//----------------------------------------------------------------------------- +// Time / Date details +//----------------------------------------------------------------------------- +#define FAT_TIME_HOURS_SHIFT 11 +#define FAT_TIME_HOURS_MASK 0x1F +#define FAT_TIME_MINUTES_SHIFT 5 +#define FAT_TIME_MINUTES_MASK 0x3F +#define FAT_TIME_SECONDS_SHIFT 0 +#define FAT_TIME_SECONDS_MASK 0x1F +#define FAT_TIME_SECONDS_SCALE 2 +#define FAT_DATE_YEAR_SHIFT 9 +#define FAT_DATE_YEAR_MASK 0x7F +#define FAT_DATE_MONTH_SHIFT 5 +#define FAT_DATE_MONTH_MASK 0xF +#define FAT_DATE_DAY_SHIFT 0 +#define FAT_DATE_DAY_MASK 0x1F +#define FAT_DATE_YEAR_OFFSET 1980 + +//----------------------------------------------------------------------------- +// Other Defines +//----------------------------------------------------------------------------- +#define FAT32_LAST_CLUSTER 0xFFFFFFFF +#define FAT32_INVALID_CLUSTER 0xFFFFFFFF + +STRUCT_PACK_BEGIN +struct fat_dir_entry STRUCT_PACK +{ + uint8 Name[11]; + uint8 Attr; + uint8 NTRes; + uint8 CrtTimeTenth; + uint8 CrtTime[2]; + uint8 CrtDate[2]; + uint8 LstAccDate[2]; + uint16 FstClusHI; + uint8 WrtTime[2]; + uint8 WrtDate[2]; + uint16 FstClusLO; + uint32 FileSize; +} STRUCT_PACKED; +STRUCT_PACK_END + +#endif diff --git a/src/gui/Lib/fat_io_lib/fat_filelib.c b/src/gui/Lib/fat_io_lib/fat_filelib.c new file mode 100644 index 0000000..2c4a236 --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_filelib.c @@ -0,0 +1,1603 @@ +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// FAT16/32 File IO Library +// V2.6 +// Ultra-Embedded.com +// Copyright 2003 - 2012 +// +// Email: admin@ultra-embedded.com +// +// License: GPL +// If you would like a version with a more permissive license for use in +// closed source commercial applications please contact me for details. +//----------------------------------------------------------------------------- +// +// This file is part of FAT File IO Library. +// +// FAT File IO Library is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// FAT File IO Library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with FAT File IO Library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#include +#include +#include "fat_defs.h" +#include "fat_access.h" +#include "fat_table.h" +#include "fat_write.h" +#include "fat_misc.h" +#include "fat_string.h" +#include "fat_filelib.h" +#include "fat_cache.h" + +//----------------------------------------------------------------------------- +// Locals +//----------------------------------------------------------------------------- +static FL_FILE _files[FATFS_MAX_OPEN_FILES]; +static int _filelib_init = 0; +static int _filelib_valid = 0; +static struct fatfs _fs; +static struct fat_list _open_file_list; +static struct fat_list _free_file_list; + +//----------------------------------------------------------------------------- +// Macros +//----------------------------------------------------------------------------- + +// Macro for checking if file lib is initialised +#define CHECK_FL_INIT() { if (_filelib_init==0) fl_init(); } + +#define FL_LOCK(a) do { if ((a)->fl_lock) (a)->fl_lock(); } while (0) +#define FL_UNLOCK(a) do { if ((a)->fl_unlock) (a)->fl_unlock(); } while (0) + +//----------------------------------------------------------------------------- +// Local Functions +//----------------------------------------------------------------------------- +static void _fl_init(); + +//----------------------------------------------------------------------------- +// _allocate_file: Find a slot in the open files buffer for a new file +//----------------------------------------------------------------------------- +static FL_FILE* _allocate_file(void) +{ + // Allocate free file + struct fat_node *node = fat_list_pop_head(&_free_file_list); + + // Add to open list + if (node) + fat_list_insert_last(&_open_file_list, node); + + return fat_list_entry(node, FL_FILE, list_node); +} +//----------------------------------------------------------------------------- +// _check_file_open: Returns true if the file is already open +//----------------------------------------------------------------------------- +static int _check_file_open(FL_FILE* file) +{ + struct fat_node *node; + + // Compare open files + fat_list_for_each(&_open_file_list, node) + { + FL_FILE* openFile = fat_list_entry(node, FL_FILE, list_node); + + // If not the current file + if (openFile != file) + { + // Compare path and name + if ( (fatfs_compare_names(openFile->path,file->path)) && (fatfs_compare_names(openFile->filename,file->filename)) ) + return 1; + } + } + + return 0; +} +//----------------------------------------------------------------------------- +// _free_file: Free open file handle +//----------------------------------------------------------------------------- +static void _free_file(FL_FILE* file) +{ + // Remove from open list + fat_list_remove(&_open_file_list, &file->list_node); + + // Add to free list + fat_list_insert_last(&_free_file_list, &file->list_node); +} + +//----------------------------------------------------------------------------- +// Low Level +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// _open_directory: Cycle through path string to find the start cluster +// address of the highest subdir. +//----------------------------------------------------------------------------- +static int _open_directory(char *path, uint32 *pathCluster) +{ + int levels; + int sublevel; + char currentfolder[FATFS_MAX_LONG_FILENAME]; + struct fat_dir_entry sfEntry; + uint32 startcluster; + + // Set starting cluster to root cluster + startcluster = fatfs_get_root_cluster(&_fs); + + // Find number of levels + levels = fatfs_total_path_levels(path); + + // Cycle through each level and get the start sector + for (sublevel=0;sublevel<(levels+1);sublevel++) + { + if (fatfs_get_substring(path, sublevel, currentfolder, sizeof(currentfolder)) == -1) + return 0; + + // Find clusteraddress for folder (currentfolder) + if (fatfs_get_file_entry(&_fs, startcluster, currentfolder,&sfEntry)) + { + // Check entry is folder + if (fatfs_entry_is_dir(&sfEntry)) + startcluster = ((FAT_HTONS((uint32)sfEntry.FstClusHI))<<16) + FAT_HTONS(sfEntry.FstClusLO); + else + return 0; + } + else + return 0; + } + + *pathCluster = startcluster; + return 1; +} +//----------------------------------------------------------------------------- +// _create_directory: Cycle through path string and create the end directory +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +static int _create_directory(char *path) +{ + FL_FILE* file; + struct fat_dir_entry sfEntry; + char shortFilename[FAT_SFN_SIZE_FULL]; + int tailNum = 0; + int i; + + // Allocate a new file handle + file = _allocate_file(); + if (!file) + return 0; + + // Clear filename + memset(file->path, '\0', sizeof(file->path)); + memset(file->filename, '\0', sizeof(file->filename)); + + // Split full path into filename and directory path + if (fatfs_split_path((char*)path, file->path, sizeof(file->path), file->filename, sizeof(file->filename)) == -1) + { + _free_file(file); + return 0; + } + + // Check if file already open + if (_check_file_open(file)) + { + _free_file(file); + return 0; + } + + // If file is in the root dir + if (file->path[0] == 0) + file->parentcluster = fatfs_get_root_cluster(&_fs); + else + { + // Find parent directory start cluster + if (!_open_directory(file->path, &file->parentcluster)) + { + _free_file(file); + return 0; + } + } + + // Check if same filename exists in directory + if (fatfs_get_file_entry(&_fs, file->parentcluster, file->filename,&sfEntry) == 1) + { + _free_file(file); + return 0; + } + + file->startcluster = 0; + + // Create the file space for the folder (at least one clusters worth!) + if (!fatfs_allocate_free_space(&_fs, 1, &file->startcluster, 1)) + { + _free_file(file); + return 0; + } + + // Erase new directory cluster + memset(file->file_data_sector, 0x00, FAT_SECTOR_SIZE); + for (i=0;i<_fs.sectors_per_cluster;i++) + { + if (!fatfs_write_sector(&_fs, file->startcluster, i, file->file_data_sector)) + { + _free_file(file); + return 0; + } + } + +#if FATFS_INC_LFN_SUPPORT + + // Generate a short filename & tail + tailNum = 0; + do + { + // Create a standard short filename (without tail) + fatfs_lfn_create_sfn(shortFilename, file->filename); + + // If second hit or more, generate a ~n tail + if (tailNum != 0) + fatfs_lfn_generate_tail((char*)file->shortfilename, shortFilename, tailNum); + // Try with no tail if first entry + else + memcpy(file->shortfilename, shortFilename, FAT_SFN_SIZE_FULL); + + // Check if entry exists already or not + if (fatfs_sfn_exists(&_fs, file->parentcluster, (char*)file->shortfilename) == 0) + break; + + tailNum++; + } + while (tailNum < 9999); + + // We reached the max number of duplicate short file names (unlikely!) + if (tailNum == 9999) + { + // Delete allocated space + fatfs_free_cluster_chain(&_fs, file->startcluster); + + _free_file(file); + return 0; + } +#else + // Create a standard short filename (without tail) + if (!fatfs_lfn_create_sfn(shortFilename, file->filename)) + { + // Delete allocated space + fatfs_free_cluster_chain(&_fs, file->startcluster); + + _free_file(file); + return 0; + } + + // Copy to SFN space + memcpy(file->shortfilename, shortFilename, FAT_SFN_SIZE_FULL); + + // Check if entry exists already + if (fatfs_sfn_exists(&_fs, file->parentcluster, (char*)file->shortfilename)) + { + // Delete allocated space + fatfs_free_cluster_chain(&_fs, file->startcluster); + + _free_file(file); + return 0; + } +#endif + + // Add file to disk + if (!fatfs_add_file_entry(&_fs, file->parentcluster, (char*)file->filename, (char*)file->shortfilename, file->startcluster, 0, 1)) + { + // Delete allocated space + fatfs_free_cluster_chain(&_fs, file->startcluster); + + _free_file(file); + return 0; + } + + // General + file->filelength = 0; + file->bytenum = 0; + file->file_data_address = 0xFFFFFFFF; + file->file_data_dirty = 0; + file->filelength_changed = 0; + + // Quick lookup for next link in the chain + file->last_fat_lookup.ClusterIdx = 0xFFFFFFFF; + file->last_fat_lookup.CurrentCluster = 0xFFFFFFFF; + + fatfs_fat_purge(&_fs); + + _free_file(file); + return 1; +} +#endif +//----------------------------------------------------------------------------- +// _open_file: Open a file for reading +//----------------------------------------------------------------------------- +static FL_FILE* _open_file(const char *path) +{ + FL_FILE* file; + struct fat_dir_entry sfEntry; + + // Allocate a new file handle + file = _allocate_file(); + if (!file) + return NULL; + + // Clear filename + memset(file->path, '\0', sizeof(file->path)); + memset(file->filename, '\0', sizeof(file->filename)); + + // Split full path into filename and directory path + if (fatfs_split_path((char*)path, file->path, sizeof(file->path), file->filename, sizeof(file->filename)) == -1) + { + _free_file(file); + return NULL; + } + + // Check if file already open + if (_check_file_open(file)) + { + _free_file(file); + return NULL; + } + + // If file is in the root dir + if (file->path[0]==0) + file->parentcluster = fatfs_get_root_cluster(&_fs); + else + { + // Find parent directory start cluster + if (!_open_directory(file->path, &file->parentcluster)) + { + _free_file(file); + return NULL; + } + } + + // Using dir cluster address search for filename + if (fatfs_get_file_entry(&_fs, file->parentcluster, file->filename,&sfEntry)) + // Make sure entry is file not dir! + if (fatfs_entry_is_file(&sfEntry)) + { + // Initialise file details + memcpy(file->shortfilename, sfEntry.Name, FAT_SFN_SIZE_FULL); + file->filelength = FAT_HTONL(sfEntry.FileSize); + file->bytenum = 0; + file->startcluster = ((FAT_HTONS((uint32)sfEntry.FstClusHI))<<16) + FAT_HTONS(sfEntry.FstClusLO); + file->file_data_address = 0xFFFFFFFF; + file->file_data_dirty = 0; + file->filelength_changed = 0; + + // Quick lookup for next link in the chain + file->last_fat_lookup.ClusterIdx = 0xFFFFFFFF; + file->last_fat_lookup.CurrentCluster = 0xFFFFFFFF; + + fatfs_cache_init(&_fs, file); + + fatfs_fat_purge(&_fs); + + return file; + } + + _free_file(file); + return NULL; +} +//----------------------------------------------------------------------------- +// _create_file: Create a new file +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +static FL_FILE* _create_file(const char *filename) +{ + FL_FILE* file; + struct fat_dir_entry sfEntry; + char shortFilename[FAT_SFN_SIZE_FULL]; + int tailNum = 0; + + // No write access? + if (!_fs.disk_io.write_media) + return NULL; + + // Allocate a new file handle + file = _allocate_file(); + if (!file) + return NULL; + + // Clear filename + memset(file->path, '\0', sizeof(file->path)); + memset(file->filename, '\0', sizeof(file->filename)); + + // Split full path into filename and directory path + if (fatfs_split_path((char*)filename, file->path, sizeof(file->path), file->filename, sizeof(file->filename)) == -1) + { + _free_file(file); + return NULL; + } + + // Check if file already open + if (_check_file_open(file)) + { + _free_file(file); + return NULL; + } + + // If file is in the root dir + if (file->path[0] == 0) + file->parentcluster = fatfs_get_root_cluster(&_fs); + else + { + // Find parent directory start cluster + if (!_open_directory(file->path, &file->parentcluster)) + { + _free_file(file); + return NULL; + } + } + + // Check if same filename exists in directory + if (fatfs_get_file_entry(&_fs, file->parentcluster, file->filename,&sfEntry) == 1) + { + _free_file(file); + return NULL; + } + + file->startcluster = 0; + + // Create the file space for the file (at least one clusters worth!) + if (!fatfs_allocate_free_space(&_fs, 1, &file->startcluster, 1)) + { + _free_file(file); + return NULL; + } + +#if FATFS_INC_LFN_SUPPORT + // Generate a short filename & tail + tailNum = 0; + do + { + // Create a standard short filename (without tail) + fatfs_lfn_create_sfn(shortFilename, file->filename); + + // If second hit or more, generate a ~n tail + if (tailNum != 0) + fatfs_lfn_generate_tail((char*)file->shortfilename, shortFilename, tailNum); + // Try with no tail if first entry + else + memcpy(file->shortfilename, shortFilename, FAT_SFN_SIZE_FULL); + + // Check if entry exists already or not + if (fatfs_sfn_exists(&_fs, file->parentcluster, (char*)file->shortfilename) == 0) + break; + + tailNum++; + } + while (tailNum < 9999); + + // We reached the max number of duplicate short file names (unlikely!) + if (tailNum == 9999) + { + // Delete allocated space + fatfs_free_cluster_chain(&_fs, file->startcluster); + + _free_file(file); + return NULL; + } +#else + // Create a standard short filename (without tail) + if (!fatfs_lfn_create_sfn(shortFilename, file->filename)) + { + // Delete allocated space + fatfs_free_cluster_chain(&_fs, file->startcluster); + + _free_file(file); + return NULL; + } + + // Copy to SFN space + memcpy(file->shortfilename, shortFilename, FAT_SFN_SIZE_FULL); + + // Check if entry exists already + if (fatfs_sfn_exists(&_fs, file->parentcluster, (char*)file->shortfilename)) + { + // Delete allocated space + fatfs_free_cluster_chain(&_fs, file->startcluster); + + _free_file(file); + return NULL; + } +#endif + + // Add file to disk + if (!fatfs_add_file_entry(&_fs, file->parentcluster, (char*)file->filename, (char*)file->shortfilename, file->startcluster, 0, 0)) + { + // Delete allocated space + fatfs_free_cluster_chain(&_fs, file->startcluster); + + _free_file(file); + return NULL; + } + + // General + file->filelength = 0; + file->bytenum = 0; + file->file_data_address = 0xFFFFFFFF; + file->file_data_dirty = 0; + file->filelength_changed = 0; + + // Quick lookup for next link in the chain + file->last_fat_lookup.ClusterIdx = 0xFFFFFFFF; + file->last_fat_lookup.CurrentCluster = 0xFFFFFFFF; + + fatfs_cache_init(&_fs, file); + + fatfs_fat_purge(&_fs); + + return file; +} +#endif +//----------------------------------------------------------------------------- +// _read_sectors: Read sector(s) from disk to file +//----------------------------------------------------------------------------- +static uint32 _read_sectors(FL_FILE* file, uint32 offset, uint8 *buffer, uint32 count) +{ + uint32 Sector = 0; + uint32 ClusterIdx = 0; + uint32 Cluster = 0; + uint32 i; + uint32 lba; + + // Find cluster index within file & sector with cluster + ClusterIdx = offset / _fs.sectors_per_cluster; + Sector = offset - (ClusterIdx * _fs.sectors_per_cluster); + + // Limit number of sectors read to the number remaining in this cluster + if ((Sector + count) > _fs.sectors_per_cluster) + count = _fs.sectors_per_cluster - Sector; + + // Quick lookup for next link in the chain + if (ClusterIdx == file->last_fat_lookup.ClusterIdx) + Cluster = file->last_fat_lookup.CurrentCluster; + // Else walk the chain + else + { + // Starting from last recorded cluster? + if (ClusterIdx && ClusterIdx == file->last_fat_lookup.ClusterIdx + 1) + { + i = file->last_fat_lookup.ClusterIdx; + Cluster = file->last_fat_lookup.CurrentCluster; + } + // Start searching from the beginning.. + else + { + // Set start of cluster chain to initial value + i = 0; + Cluster = file->startcluster; + } + + // Follow chain to find cluster to read + for ( ;ilast_fat_lookup.CurrentCluster = Cluster; + file->last_fat_lookup.ClusterIdx = ClusterIdx; + } + } + + // If end of cluster chain then return false + if (Cluster == FAT32_LAST_CLUSTER) + return 0; + + // Calculate sector address + lba = fatfs_lba_of_cluster(&_fs, Cluster) + Sector; + + // Read sector of file + if (fatfs_sector_read(&_fs, lba, buffer, count)) + return count; + else + return 0; +} + +//----------------------------------------------------------------------------- +// External API +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// fl_init: Initialise library +//----------------------------------------------------------------------------- +void fl_init(void) +{ + int i; + + fat_list_init(&_free_file_list); + fat_list_init(&_open_file_list); + + // Add all file objects to free list + for (i=0;iflags = flags; + + FL_UNLOCK(&_fs); + return file; +} +//----------------------------------------------------------------------------- +// _write_sectors: Write sector(s) to disk +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +static uint32 _write_sectors(FL_FILE* file, uint32 offset, uint8 *buf, uint32 count) +{ + uint32 SectorNumber = 0; + uint32 ClusterIdx = 0; + uint32 Cluster = 0; + uint32 LastCluster = FAT32_LAST_CLUSTER; + uint32 i; + uint32 lba; + uint32 TotalWriteCount = count; + + // Find values for Cluster index & sector within cluster + ClusterIdx = offset / _fs.sectors_per_cluster; + SectorNumber = offset - (ClusterIdx * _fs.sectors_per_cluster); + + // Limit number of sectors written to the number remaining in this cluster + if ((SectorNumber + count) > _fs.sectors_per_cluster) + count = _fs.sectors_per_cluster - SectorNumber; + + // Quick lookup for next link in the chain + if (ClusterIdx == file->last_fat_lookup.ClusterIdx) + Cluster = file->last_fat_lookup.CurrentCluster; + // Else walk the chain + else + { + // Starting from last recorded cluster? + if (ClusterIdx && ClusterIdx == file->last_fat_lookup.ClusterIdx + 1) + { + i = file->last_fat_lookup.ClusterIdx; + Cluster = file->last_fat_lookup.CurrentCluster; + } + // Start searching from the beginning.. + else + { + // Set start of cluster chain to initial value + i = 0; + Cluster = file->startcluster; + } + + // Follow chain to find cluster to read + for ( ;ilast_fat_lookup.CurrentCluster = Cluster; + file->last_fat_lookup.ClusterIdx = ClusterIdx; + } + + // Calculate write address + lba = fatfs_lba_of_cluster(&_fs, Cluster) + SectorNumber; + + if (fatfs_sector_write(&_fs, lba, buf, count)) + return count; + else + return 0; +} +#endif +//----------------------------------------------------------------------------- +// fl_fflush: Flush un-written data to the file +//----------------------------------------------------------------------------- +int fl_fflush(void *f) +{ +#if FATFS_INC_WRITE_SUPPORT + FL_FILE *file = (FL_FILE *)f; + + // If first call to library, initialise + CHECK_FL_INIT(); + + if (file) + { + FL_LOCK(&_fs); + + // If some write data still in buffer + if (file->file_data_dirty) + { + // Write back current sector before loading next + if (_write_sectors(file, file->file_data_address, file->file_data_sector, 1)) + file->file_data_dirty = 0; + } + + FL_UNLOCK(&_fs); + } +#endif + return 0; +} +//----------------------------------------------------------------------------- +// fl_fclose: Close an open file +//----------------------------------------------------------------------------- +void fl_fclose(void *f) +{ + FL_FILE *file = (FL_FILE *)f; + + // If first call to library, initialise + CHECK_FL_INIT(); + + if (file) + { + FL_LOCK(&_fs); + + // Flush un-written data to file + fl_fflush(f); + + // File size changed? + if (file->filelength_changed) + { +#if FATFS_INC_WRITE_SUPPORT + // Update filesize in directory + fatfs_update_file_length(&_fs, file->parentcluster, (char*)file->shortfilename, file->filelength); +#endif + file->filelength_changed = 0; + } + + file->bytenum = 0; + file->filelength = 0; + file->startcluster = 0; + file->file_data_address = 0xFFFFFFFF; + file->file_data_dirty = 0; + file->filelength_changed = 0; + + // Free file handle + _free_file(file); + + fatfs_fat_purge(&_fs); + + FL_UNLOCK(&_fs); + } +} +//----------------------------------------------------------------------------- +// fl_fgetc: Get a character in the stream +//----------------------------------------------------------------------------- +int fl_fgetc(void *f) +{ + int res; + uint8 data = 0; + + res = fl_fread(&data, 1, 1, f); + if (res == 1) + return (int)data; + else + return res; +} +//----------------------------------------------------------------------------- +// fl_fgets: Get a string from a stream +//----------------------------------------------------------------------------- +char *fl_fgets(char *s, int n, void *f) +{ + int idx = 0; + + // Space for null terminator? + if (n > 0) + { + // While space (+space for null terminator) + while (idx < (n-1)) + { + int ch = fl_fgetc(f); + + // EOF / Error? + if (ch < 0) + break; + + // Store character read from stream + s[idx++] = (char)ch; + + // End of line? + if (ch == '\n') + break; + } + + if (idx > 0) + s[idx] = '\0'; + } + + return (idx > 0) ? s : 0; +} +//----------------------------------------------------------------------------- +// fl_fread: Read a block of data from the file +//----------------------------------------------------------------------------- +int fl_fread(void * buffer, int size, int length, void *f ) +{ + uint32 sector; + uint32 offset; + int copyCount; + int count = size * length; + int bytesRead = 0; + + FL_FILE *file = (FL_FILE *)f; + + // If first call to library, initialise + CHECK_FL_INIT(); + + if (buffer==NULL || file==NULL) + return -1; + + // No read permissions + if (!(file->flags & FILE_READ)) + return -1; + + // Nothing to be done + if (!count) + return 0; + + // Check if read starts past end of file + if (file->bytenum >= file->filelength) + return -1; + + // Limit to file size + if ( (file->bytenum + count) > file->filelength ) + count = file->filelength - file->bytenum; + + // Calculate start sector + sector = file->bytenum / FAT_SECTOR_SIZE; + + // Offset to start copying data from first sector + offset = file->bytenum % FAT_SECTOR_SIZE; + + while (bytesRead < count) + { + // Read whole sector, read from media directly into target buffer + if ((offset == 0) && ((count - bytesRead) >= FAT_SECTOR_SIZE)) + { + // Read as many sectors as possible into target buffer + uint32 sectorsRead = _read_sectors(file, sector, (uint8*)((uint8*)buffer + bytesRead), (count - bytesRead) / FAT_SECTOR_SIZE); + if (sectorsRead) + { + // We have upto one sector to copy + copyCount = FAT_SECTOR_SIZE * sectorsRead; + + // Move onto next sector and reset copy offset + sector+= sectorsRead; + offset = 0; + } + else + break; + } + else + { + // Do we need to re-read the sector? + if (file->file_data_address != sector) + { + // Flush un-written data to file + if (file->file_data_dirty) + fl_fflush(file); + + // Get LBA of sector offset within file + if (!_read_sectors(file, sector, file->file_data_sector, 1)) + // Read failed - out of range (probably) + break; + + file->file_data_address = sector; + file->file_data_dirty = 0; + } + + // We have upto one sector to copy + copyCount = FAT_SECTOR_SIZE - offset; + + // Only require some of this sector? + if (copyCount > (count - bytesRead)) + copyCount = (count - bytesRead); + + // Copy to application buffer + memcpy( (uint8*)((uint8*)buffer + bytesRead), (uint8*)(file->file_data_sector + offset), copyCount); + + // Move onto next sector and reset copy offset + sector++; + offset = 0; + } + + // Increase total read count + bytesRead += copyCount; + + // Increment file pointer + file->bytenum += copyCount; + } + + return bytesRead; +} +//----------------------------------------------------------------------------- +// fl_fseek: Seek to a specific place in the file +//----------------------------------------------------------------------------- +int fl_fseek( void *f, long offset, int origin ) +{ + FL_FILE *file = (FL_FILE *)f; + int res = -1; + + // If first call to library, initialise + CHECK_FL_INIT(); + + if (!file) + return -1; + + if (origin == SEEK_END && offset != 0) + return -1; + + FL_LOCK(&_fs); + + // Invalidate file buffer + file->file_data_address = 0xFFFFFFFF; + file->file_data_dirty = 0; + + if (origin == SEEK_SET) + { + file->bytenum = (uint32)offset; + + if (file->bytenum > file->filelength) + file->bytenum = file->filelength; + + res = 0; + } + else if (origin == SEEK_CUR) + { + // Positive shift + if (offset >= 0) + { + file->bytenum += offset; + + if (file->bytenum > file->filelength) + file->bytenum = file->filelength; + } + // Negative shift + else + { + // Make shift positive + offset = -offset; + + // Limit to negative shift to start of file + if ((uint32)offset > file->bytenum) + file->bytenum = 0; + else + file->bytenum-= offset; + } + + res = 0; + } + else if (origin == SEEK_END) + { + file->bytenum = file->filelength; + res = 0; + } + else + res = -1; + + FL_UNLOCK(&_fs); + + return res; +} +//----------------------------------------------------------------------------- +// fl_fgetpos: Get the current file position +//----------------------------------------------------------------------------- +int fl_fgetpos(void *f , uint32 * position) +{ + FL_FILE *file = (FL_FILE *)f; + + if (!file) + return -1; + + FL_LOCK(&_fs); + + // Get position + *position = file->bytenum; + + FL_UNLOCK(&_fs); + + return 0; +} +//----------------------------------------------------------------------------- +// fl_ftell: Get the current file position +//----------------------------------------------------------------------------- +long fl_ftell(void *f) +{ + uint32 pos = 0; + + fl_fgetpos(f, &pos); + + return (long)pos; +} +//----------------------------------------------------------------------------- +// fl_feof: Is the file pointer at the end of the stream? +//----------------------------------------------------------------------------- +int fl_feof(void *f) +{ + FL_FILE *file = (FL_FILE *)f; + int res; + + if (!file) + return -1; + + FL_LOCK(&_fs); + + if (file->bytenum == file->filelength) + res = EOF; + else + res = 0; + + FL_UNLOCK(&_fs); + + return res; +} +//----------------------------------------------------------------------------- +// fl_fputc: Write a character to the stream +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fl_fputc(int c, void *f) +{ + uint8 data = (uint8)c; + int res; + + res = fl_fwrite(&data, 1, 1, f); + if (res == 1) + return c; + else + return res; +} +#endif +//----------------------------------------------------------------------------- +// fl_fwrite: Write a block of data to the stream +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fl_fwrite(const void * data, int size, int count, void *f ) +{ + FL_FILE *file = (FL_FILE *)f; + uint32 sector; + uint32 offset; + uint32 length = (size*count); + uint8 *buffer = (uint8 *)data; + uint32 bytesWritten = 0; + uint32 copyCount; + + // If first call to library, initialise + CHECK_FL_INIT(); + + if (!file) + return -1; + + FL_LOCK(&_fs); + + // No write permissions + if (!(file->flags & FILE_WRITE)) + { + FL_UNLOCK(&_fs); + return -1; + } + + // Append writes to end of file + if (file->flags & FILE_APPEND) + file->bytenum = file->filelength; + // Else write to current position + + // Calculate start sector + sector = file->bytenum / FAT_SECTOR_SIZE; + + // Offset to start copying data from first sector + offset = file->bytenum % FAT_SECTOR_SIZE; + + while (bytesWritten < length) + { + // Whole sector or more to be written? + if ((offset == 0) && ((length - bytesWritten) >= FAT_SECTOR_SIZE)) + { + uint32 sectorsWrote; + + // Buffered sector, flush back to disk + if (file->file_data_address != 0xFFFFFFFF) + { + // Flush un-written data to file + if (file->file_data_dirty) + fl_fflush(file); + + file->file_data_address = 0xFFFFFFFF; + file->file_data_dirty = 0; + } + + // Write as many sectors as possible + sectorsWrote = _write_sectors(file, sector, (uint8*)(buffer + bytesWritten), (length - bytesWritten) / FAT_SECTOR_SIZE); + copyCount = FAT_SECTOR_SIZE * sectorsWrote; + + // Increase total read count + bytesWritten += copyCount; + + // Increment file pointer + file->bytenum += copyCount; + + // Move onto next sector and reset copy offset + sector+= sectorsWrote; + offset = 0; + + if (!sectorsWrote) + break; + } + else + { + // We have upto one sector to copy + copyCount = FAT_SECTOR_SIZE - offset; + + // Only require some of this sector? + if (copyCount > (length - bytesWritten)) + copyCount = (length - bytesWritten); + + // Do we need to read a new sector? + if (file->file_data_address != sector) + { + // Flush un-written data to file + if (file->file_data_dirty) + fl_fflush(file); + + // If we plan to overwrite the whole sector, we don't need to read it first! + if (copyCount != FAT_SECTOR_SIZE) + { + // NOTE: This does not have succeed; if last sector of file + // reached, no valid data will be read in, but write will + // allocate some more space for new data. + + // Get LBA of sector offset within file + if (!_read_sectors(file, sector, file->file_data_sector, 1)) + memset(file->file_data_sector, 0x00, FAT_SECTOR_SIZE); + } + + file->file_data_address = sector; + file->file_data_dirty = 0; + } + + // Copy from application buffer into sector buffer + memcpy((uint8*)(file->file_data_sector + offset), (uint8*)(buffer + bytesWritten), copyCount); + + // Mark buffer as dirty + file->file_data_dirty = 1; + + // Increase total read count + bytesWritten += copyCount; + + // Increment file pointer + file->bytenum += copyCount; + + // Move onto next sector and reset copy offset + sector++; + offset = 0; + } + } + + // Write increased extent of the file? + if (file->bytenum > file->filelength) + { + // Increase file size to new point + file->filelength = file->bytenum; + + // We are changing the file length and this + // will need to be writen back at some point + file->filelength_changed = 1; + } + +#if FATFS_INC_TIME_DATE_SUPPORT + // If time & date support is enabled, always force directory entry to be + // written in-order to update file modify / access time & date. + file->filelength_changed = 1; +#endif + + FL_UNLOCK(&_fs); + + return (size*count); +} +#endif +//----------------------------------------------------------------------------- +// fl_fputs: Write a character string to the stream +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fl_fputs(const char * str, void *f) +{ + int len = (int)strlen(str); + int res = fl_fwrite(str, 1, len, f); + + if (res == len) + return len; + else + return res; +} +#endif +//----------------------------------------------------------------------------- +// fl_remove: Remove a file from the filesystem +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fl_remove( const char * filename ) +{ + FL_FILE* file; + int res = -1; + + FL_LOCK(&_fs); + + // Use read_file as this will check if the file is already open! + file = fl_fopen((char*)filename, "r"); + if (file) + { + // Delete allocated space + if (fatfs_free_cluster_chain(&_fs, file->startcluster)) + { + // Remove directory entries + if (fatfs_mark_file_deleted(&_fs, file->parentcluster, (char*)file->shortfilename)) + { + // Close the file handle (this should not write anything to the file + // as we have not changed the file since opening it!) + fl_fclose(file); + + res = 0; + } + } + } + + FL_UNLOCK(&_fs); + + return res; +} +#endif +//----------------------------------------------------------------------------- +// fl_createdirectory: Create a directory based on a path +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fl_createdirectory(const char *path) +{ + int res; + + // If first call to library, initialise + CHECK_FL_INIT(); + + FL_LOCK(&_fs); + res =_create_directory((char*)path); + FL_UNLOCK(&_fs); + + return res; +} +#endif +//----------------------------------------------------------------------------- +// fl_listdirectory: List a directory based on a path +//----------------------------------------------------------------------------- +#if FATFS_DIR_LIST_SUPPORT +void fl_listdirectory(const char *path) +{ + FL_DIR dirstat; + + // If first call to library, initialise + CHECK_FL_INIT(); + + FL_LOCK(&_fs); + + FAT_PRINTF(("\r\nDirectory %s\r\n", path)); + + if (fl_opendir(path, &dirstat)) + { + struct fs_dir_ent dirent; + + while (fl_readdir(&dirstat, &dirent) == 0) + { +#if FATFS_INC_TIME_DATE_SUPPORT + int d,m,y,h,mn,s; + fatfs_convert_from_fat_time(dirent.write_time, &h,&m,&s); + fatfs_convert_from_fat_date(dirent.write_date, &d,&mn,&y); + FAT_PRINTF(("%02d/%02d/%04d %02d:%02d ", d,mn,y,h,m)); +#endif + + if (dirent.is_dir) + { + FAT_PRINTF(("%s \r\n", dirent.filename)); + } + else + { + FAT_PRINTF(("%s [%d bytes]\r\n", dirent.filename, dirent.size)); + } + } + + fl_closedir(&dirstat); + } + + FL_UNLOCK(&_fs); +} +#endif +//----------------------------------------------------------------------------- +// fl_opendir: Opens a directory for listing +//----------------------------------------------------------------------------- +#if FATFS_DIR_LIST_SUPPORT +FL_DIR* fl_opendir(const char* path, FL_DIR *dir) +{ + int levels; + int res = 1; + uint32 cluster = FAT32_INVALID_CLUSTER; + + // If first call to library, initialise + CHECK_FL_INIT(); + + FL_LOCK(&_fs); + + levels = fatfs_total_path_levels((char*)path) + 1; + + // If path is in the root dir + if (levels == 0) + cluster = fatfs_get_root_cluster(&_fs); + // Find parent directory start cluster + else + res = _open_directory((char*)path, &cluster); + + if (res) + fatfs_list_directory_start(&_fs, dir, cluster); + + FL_UNLOCK(&_fs); + + return cluster != FAT32_INVALID_CLUSTER ? dir : 0; +} +#endif +//----------------------------------------------------------------------------- +// fl_readdir: Get next item in directory +//----------------------------------------------------------------------------- +#if FATFS_DIR_LIST_SUPPORT +int fl_readdir(FL_DIR *dirls, fl_dirent *entry) +{ + int res = 0; + + // If first call to library, initialise + CHECK_FL_INIT(); + + FL_LOCK(&_fs); + + res = fatfs_list_directory_next(&_fs, dirls, entry); + + FL_UNLOCK(&_fs); + + return res ? 0 : -1; +} +#endif +//----------------------------------------------------------------------------- +// fl_closedir: Close directory after listing +//----------------------------------------------------------------------------- +#if FATFS_DIR_LIST_SUPPORT +int fl_closedir(FL_DIR* dir) +{ + // Not used + return 0; +} +#endif +//----------------------------------------------------------------------------- +// fl_is_dir: Is this a directory? +//----------------------------------------------------------------------------- +#if FATFS_DIR_LIST_SUPPORT +int fl_is_dir(const char *path) +{ + int res = 0; + FL_DIR dir; + + if (fl_opendir(path, &dir)) + { + res = 1; + fl_closedir(&dir); + } + + return res; +} +#endif +//----------------------------------------------------------------------------- +// fl_format: Format a partition with either FAT16 or FAT32 based on size +//----------------------------------------------------------------------------- +#if FATFS_INC_FORMAT_SUPPORT +int fl_format(uint32 volume_sectors, const char *name) +{ + return fatfs_format(&_fs, volume_sectors, name); +} +#endif /*FATFS_INC_FORMAT_SUPPORT*/ +//----------------------------------------------------------------------------- +// fl_get_fs: +//----------------------------------------------------------------------------- +#ifdef FATFS_INC_TEST_HOOKS +struct fatfs* fl_get_fs(void) +{ + return &_fs; +} +#endif diff --git a/src/gui/Lib/fat_io_lib/fat_filelib.h b/src/gui/Lib/fat_io_lib/fat_filelib.h new file mode 100644 index 0000000..a40a28f --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_filelib.h @@ -0,0 +1,146 @@ +#ifndef __FAT_FILELIB_H__ +#define __FAT_FILELIB_H__ + +#include "fat_opts.h" +#include "fat_access.h" +#include "fat_list.h" + +//----------------------------------------------------------------------------- +// Defines +//----------------------------------------------------------------------------- +#ifndef SEEK_CUR + #define SEEK_CUR 1 +#endif + +#ifndef SEEK_END + #define SEEK_END 2 +#endif + +#ifndef SEEK_SET + #define SEEK_SET 0 +#endif + +#ifndef EOF + #define EOF (-1) +#endif + +//----------------------------------------------------------------------------- +// Structures +//----------------------------------------------------------------------------- +struct sFL_FILE; + +struct cluster_lookup +{ + uint32 ClusterIdx; + uint32 CurrentCluster; +}; + +typedef struct sFL_FILE +{ + uint32 parentcluster; + uint32 startcluster; + uint32 bytenum; + uint32 filelength; + int filelength_changed; + char path[FATFS_MAX_LONG_FILENAME]; + char filename[FATFS_MAX_LONG_FILENAME]; + uint8 shortfilename[11]; + +#ifdef FAT_CLUSTER_CACHE_ENTRIES + uint32 cluster_cache_idx[FAT_CLUSTER_CACHE_ENTRIES]; + uint32 cluster_cache_data[FAT_CLUSTER_CACHE_ENTRIES]; +#endif + + // Cluster Lookup + struct cluster_lookup last_fat_lookup; + + // Read/Write sector buffer + uint8 file_data_sector[FAT_SECTOR_SIZE]; + uint32 file_data_address; + int file_data_dirty; + + // File fopen flags + uint8 flags; +#define FILE_READ (1 << 0) +#define FILE_WRITE (1 << 1) +#define FILE_APPEND (1 << 2) +#define FILE_BINARY (1 << 3) +#define FILE_ERASE (1 << 4) +#define FILE_CREATE (1 << 5) + + struct fat_node list_node; +} FL_FILE; + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- + +// External +void fl_init(void); +void fl_attach_locks(void (*lock)(void), void (*unlock)(void)); +int fl_attach_media(fn_diskio_read rd, fn_diskio_write wr); +void fl_shutdown(void); + +// Standard API +void* fl_fopen(const char *path, const char *modifiers); +void fl_fclose(void *file); +int fl_fflush(void *file); +int fl_fgetc(void *file); +char * fl_fgets(char *s, int n, void *f); +int fl_fputc(int c, void *file); +int fl_fputs(const char * str, void *file); +int fl_fwrite(const void * data, int size, int count, void *file ); +int fl_fread(void * data, int size, int count, void *file ); +int fl_fseek(void *file , long offset , int origin ); +int fl_fgetpos(void *file , uint32 * position); +long fl_ftell(void *f); +int fl_feof(void *f); +int fl_remove(const char * filename); + +// Equivelant dirent.h +typedef struct fs_dir_list_status FL_DIR; +typedef struct fs_dir_ent fl_dirent; + +FL_DIR* fl_opendir(const char* path, FL_DIR *dir); +int fl_readdir(FL_DIR *dirls, fl_dirent *entry); +int fl_closedir(FL_DIR* dir); + +// Extensions +void fl_listdirectory(const char *path); +int fl_createdirectory(const char *path); +int fl_is_dir(const char *path); + +int fl_format(uint32 volume_sectors, const char *name); + +// Test hooks +#ifdef FATFS_INC_TEST_HOOKS +struct fatfs* fl_get_fs(void); +#endif + +//----------------------------------------------------------------------------- +// Stdio file I/O names +//----------------------------------------------------------------------------- +#ifdef USE_FILELIB_STDIO_COMPAT_NAMES + +#define FILE FL_FILE + +#define fopen(a,b) fl_fopen(a, b) +#define fclose(a) fl_fclose(a) +#define fflush(a) fl_fflush(a) +#define fgetc(a) fl_fgetc(a) +#define fgets(a,b,c) fl_fgets(a, b, c) +#define fputc(a,b) fl_fputc(a, b) +#define fputs(a,b) fl_fputs(a, b) +#define fwrite(a,b,c,d) fl_fwrite(a, b, c, d) +#define fread(a,b,c,d) fl_fread(a, b, c, d) +#define fseek(a,b,c) fl_fseek(a, b, c) +#define fgetpos(a,b) fl_fgetpos(a, b) +#define ftell(a) fl_ftell(a) +#define feof(a) fl_feof(a) +#define remove(a) fl_remove(a) +#define mkdir(a) fl_createdirectory(a) +#define rmdir(a) 0 + +#endif + +#endif diff --git a/src/gui/Lib/fat_io_lib/fat_format.c b/src/gui/Lib/fat_io_lib/fat_format.c new file mode 100644 index 0000000..d067f37 --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_format.c @@ -0,0 +1,532 @@ +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// FAT16/32 File IO Library +// V2.6 +// Ultra-Embedded.com +// Copyright 2003 - 2012 +// +// Email: admin@ultra-embedded.com +// +// License: GPL +// If you would like a version with a more permissive license for use in +// closed source commercial applications please contact me for details. +//----------------------------------------------------------------------------- +// +// This file is part of FAT File IO Library. +// +// FAT File IO Library is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// FAT File IO Library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with FAT File IO Library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#include +#include "fat_defs.h" +#include "fat_access.h" +#include "fat_table.h" +#include "fat_write.h" +#include "fat_string.h" +#include "fat_misc.h" +#include "fat_format.h" + +#if FATFS_INC_FORMAT_SUPPORT + +//----------------------------------------------------------------------------- +// Tables +//----------------------------------------------------------------------------- +struct sec_per_clus_table +{ + uint32 sectors; + uint8 sectors_per_cluster; +}; + +struct sec_per_clus_table _cluster_size_table16[] = +{ + { 32680, 2}, // 16MB - 1K + { 262144, 4}, // 128MB - 2K + { 524288, 8}, // 256MB - 4K + { 1048576, 16}, // 512MB - 8K + { 2097152, 32}, // 1GB - 16K + { 4194304, 64}, // 2GB - 32K + { 8388608, 128},// 2GB - 64K [Warning only supported by Windows XP onwards] + { 0 , 0 } // Invalid +}; + +struct sec_per_clus_table _cluster_size_table32[] = +{ + { 532480, 1}, // 260MB - 512b + { 16777216, 8}, // 8GB - 4K + { 33554432, 16}, // 16GB - 8K + { 67108864, 32}, // 32GB - 16K + { 0xFFFFFFFF, 64},// >32GB - 32K + { 0 , 0 } // Invalid +}; + +//----------------------------------------------------------------------------- +// fatfs_calc_cluster_size: Calculate what cluster size should be used +//----------------------------------------------------------------------------- +static uint8 fatfs_calc_cluster_size(uint32 sectors, int is_fat32) +{ + int i; + + if (!is_fat32) + { + for (i=0; _cluster_size_table16[i].sectors_per_cluster != 0;i++) + if (sectors <= _cluster_size_table16[i].sectors) + return _cluster_size_table16[i].sectors_per_cluster; + } + else + { + for (i=0; _cluster_size_table32[i].sectors_per_cluster != 0;i++) + if (sectors <= _cluster_size_table32[i].sectors) + return _cluster_size_table32[i].sectors_per_cluster; + } + + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_erase_sectors: Erase a number of sectors +//----------------------------------------------------------------------------- +static int fatfs_erase_sectors(struct fatfs *fs, uint32 lba, int count) +{ + int i; + + // Zero sector first + memset(fs->currentsector.sector, 0, FAT_SECTOR_SIZE); + + for (i=0;idisk_io.write_media(lba + i, fs->currentsector.sector, 1)) + return 0; + + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_create_boot_sector: Create the boot sector +//----------------------------------------------------------------------------- +static int fatfs_create_boot_sector(struct fatfs *fs, uint32 boot_sector_lba, uint32 vol_sectors, const char *name, int is_fat32) +{ + uint32 total_clusters; + int i; + + // Zero sector initially + memset(fs->currentsector.sector, 0, FAT_SECTOR_SIZE); + + // OEM Name & Jump Code + fs->currentsector.sector[0] = 0xEB; + fs->currentsector.sector[1] = 0x3C; + fs->currentsector.sector[2] = 0x90; + fs->currentsector.sector[3] = 0x4D; + fs->currentsector.sector[4] = 0x53; + fs->currentsector.sector[5] = 0x44; + fs->currentsector.sector[6] = 0x4F; + fs->currentsector.sector[7] = 0x53; + fs->currentsector.sector[8] = 0x35; + fs->currentsector.sector[9] = 0x2E; + fs->currentsector.sector[10] = 0x30; + + // Bytes per sector + fs->currentsector.sector[11] = (FAT_SECTOR_SIZE >> 0) & 0xFF; + fs->currentsector.sector[12] = (FAT_SECTOR_SIZE >> 8) & 0xFF; + + // Get sectors per cluster size for the disk + fs->sectors_per_cluster = fatfs_calc_cluster_size(vol_sectors, is_fat32); + if (!fs->sectors_per_cluster) + return 0; // Invalid disk size + + // Sectors per cluster + fs->currentsector.sector[13] = fs->sectors_per_cluster; + + // Reserved Sectors + if (!is_fat32) + fs->reserved_sectors = 8; + else + fs->reserved_sectors = 32; + fs->currentsector.sector[14] = (fs->reserved_sectors >> 0) & 0xFF; + fs->currentsector.sector[15] = (fs->reserved_sectors >> 8) & 0xFF; + + // Number of FATS + fs->num_of_fats = 2; + fs->currentsector.sector[16] = fs->num_of_fats; + + // Max entries in root dir (FAT16 only) + if (!is_fat32) + { + fs->root_entry_count = 512; + fs->currentsector.sector[17] = (fs->root_entry_count >> 0) & 0xFF; + fs->currentsector.sector[18] = (fs->root_entry_count >> 8) & 0xFF; + } + else + { + fs->root_entry_count = 0; + fs->currentsector.sector[17] = 0; + fs->currentsector.sector[18] = 0; + } + + // [FAT16] Total sectors (use FAT32 count instead) + fs->currentsector.sector[19] = 0x00; + fs->currentsector.sector[20] = 0x00; + + // Media type + fs->currentsector.sector[21] = 0xF8; + + + // FAT16 BS Details + if (!is_fat32) + { + // Count of sectors used by the FAT table (FAT16 only) + total_clusters = (vol_sectors / fs->sectors_per_cluster) + 1; + fs->fat_sectors = (total_clusters/(FAT_SECTOR_SIZE/2)) + 1; + fs->currentsector.sector[22] = (uint8)((fs->fat_sectors >> 0) & 0xFF); + fs->currentsector.sector[23] = (uint8)((fs->fat_sectors >> 8) & 0xFF); + + // Sectors per track + fs->currentsector.sector[24] = 0x00; + fs->currentsector.sector[25] = 0x00; + + // Heads + fs->currentsector.sector[26] = 0x00; + fs->currentsector.sector[27] = 0x00; + + // Hidden sectors + fs->currentsector.sector[28] = 0x20; + fs->currentsector.sector[29] = 0x00; + fs->currentsector.sector[30] = 0x00; + fs->currentsector.sector[31] = 0x00; + + // Total sectors for this volume + fs->currentsector.sector[32] = (uint8)((vol_sectors>>0)&0xFF); + fs->currentsector.sector[33] = (uint8)((vol_sectors>>8)&0xFF); + fs->currentsector.sector[34] = (uint8)((vol_sectors>>16)&0xFF); + fs->currentsector.sector[35] = (uint8)((vol_sectors>>24)&0xFF); + + // Drive number + fs->currentsector.sector[36] = 0x00; + + // Reserved + fs->currentsector.sector[37] = 0x00; + + // Boot signature + fs->currentsector.sector[38] = 0x29; + + // Volume ID + fs->currentsector.sector[39] = 0x12; + fs->currentsector.sector[40] = 0x34; + fs->currentsector.sector[41] = 0x56; + fs->currentsector.sector[42] = 0x78; + + // Volume name + for (i=0;i<11;i++) + { + if (i < (int)strlen(name)) + fs->currentsector.sector[i+43] = name[i]; + else + fs->currentsector.sector[i+43] = ' '; + } + + // File sys type + fs->currentsector.sector[54] = 'F'; + fs->currentsector.sector[55] = 'A'; + fs->currentsector.sector[56] = 'T'; + fs->currentsector.sector[57] = '1'; + fs->currentsector.sector[58] = '6'; + fs->currentsector.sector[59] = ' '; + fs->currentsector.sector[60] = ' '; + fs->currentsector.sector[61] = ' '; + + // Signature + fs->currentsector.sector[510] = 0x55; + fs->currentsector.sector[511] = 0xAA; + } + // FAT32 BS Details + else + { + // Count of sectors used by the FAT table (FAT16 only) + fs->currentsector.sector[22] = 0; + fs->currentsector.sector[23] = 0; + + // Sectors per track (default) + fs->currentsector.sector[24] = 0x3F; + fs->currentsector.sector[25] = 0x00; + + // Heads (default) + fs->currentsector.sector[26] = 0xFF; + fs->currentsector.sector[27] = 0x00; + + // Hidden sectors + fs->currentsector.sector[28] = 0x00; + fs->currentsector.sector[29] = 0x00; + fs->currentsector.sector[30] = 0x00; + fs->currentsector.sector[31] = 0x00; + + // Total sectors for this volume + fs->currentsector.sector[32] = (uint8)((vol_sectors>>0)&0xFF); + fs->currentsector.sector[33] = (uint8)((vol_sectors>>8)&0xFF); + fs->currentsector.sector[34] = (uint8)((vol_sectors>>16)&0xFF); + fs->currentsector.sector[35] = (uint8)((vol_sectors>>24)&0xFF); + + total_clusters = (vol_sectors / fs->sectors_per_cluster) + 1; + fs->fat_sectors = (total_clusters/(FAT_SECTOR_SIZE/4)) + 1; + + // BPB_FATSz32 + fs->currentsector.sector[36] = (uint8)((fs->fat_sectors>>0)&0xFF); + fs->currentsector.sector[37] = (uint8)((fs->fat_sectors>>8)&0xFF); + fs->currentsector.sector[38] = (uint8)((fs->fat_sectors>>16)&0xFF); + fs->currentsector.sector[39] = (uint8)((fs->fat_sectors>>24)&0xFF); + + // BPB_ExtFlags + fs->currentsector.sector[40] = 0; + fs->currentsector.sector[41] = 0; + + // BPB_FSVer + fs->currentsector.sector[42] = 0; + fs->currentsector.sector[43] = 0; + + // BPB_RootClus + fs->currentsector.sector[44] = (uint8)((fs->rootdir_first_cluster>>0)&0xFF); + fs->currentsector.sector[45] = (uint8)((fs->rootdir_first_cluster>>8)&0xFF); + fs->currentsector.sector[46] = (uint8)((fs->rootdir_first_cluster>>16)&0xFF); + fs->currentsector.sector[47] = (uint8)((fs->rootdir_first_cluster>>24)&0xFF); + + // BPB_FSInfo + fs->currentsector.sector[48] = (uint8)((fs->fs_info_sector>>0)&0xFF); + fs->currentsector.sector[49] = (uint8)((fs->fs_info_sector>>8)&0xFF); + + // BPB_BkBootSec + fs->currentsector.sector[50] = 6; + fs->currentsector.sector[51] = 0; + + // Drive number + fs->currentsector.sector[64] = 0x00; + + // Boot signature + fs->currentsector.sector[66] = 0x29; + + // Volume ID + fs->currentsector.sector[67] = 0x12; + fs->currentsector.sector[68] = 0x34; + fs->currentsector.sector[69] = 0x56; + fs->currentsector.sector[70] = 0x78; + + // Volume name + for (i=0;i<11;i++) + { + if (i < (int)strlen(name)) + fs->currentsector.sector[i+71] = name[i]; + else + fs->currentsector.sector[i+71] = ' '; + } + + // File sys type + fs->currentsector.sector[82] = 'F'; + fs->currentsector.sector[83] = 'A'; + fs->currentsector.sector[84] = 'T'; + fs->currentsector.sector[85] = '3'; + fs->currentsector.sector[86] = '2'; + fs->currentsector.sector[87] = ' '; + fs->currentsector.sector[88] = ' '; + fs->currentsector.sector[89] = ' '; + + // Signature + fs->currentsector.sector[510] = 0x55; + fs->currentsector.sector[511] = 0xAA; + } + + if (fs->disk_io.write_media(boot_sector_lba, fs->currentsector.sector, 1)) + return 1; + else + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_create_fsinfo_sector: Create the FSInfo sector (FAT32) +//----------------------------------------------------------------------------- +static int fatfs_create_fsinfo_sector(struct fatfs *fs, uint32 sector_lba) +{ + // Zero sector initially + memset(fs->currentsector.sector, 0, FAT_SECTOR_SIZE); + + // FSI_LeadSig + fs->currentsector.sector[0] = 0x52; + fs->currentsector.sector[1] = 0x52; + fs->currentsector.sector[2] = 0x61; + fs->currentsector.sector[3] = 0x41; + + // FSI_StrucSig + fs->currentsector.sector[484] = 0x72; + fs->currentsector.sector[485] = 0x72; + fs->currentsector.sector[486] = 0x41; + fs->currentsector.sector[487] = 0x61; + + // FSI_Free_Count + fs->currentsector.sector[488] = 0xFF; + fs->currentsector.sector[489] = 0xFF; + fs->currentsector.sector[490] = 0xFF; + fs->currentsector.sector[491] = 0xFF; + + // FSI_Nxt_Free + fs->currentsector.sector[492] = 0xFF; + fs->currentsector.sector[493] = 0xFF; + fs->currentsector.sector[494] = 0xFF; + fs->currentsector.sector[495] = 0xFF; + + // Signature + fs->currentsector.sector[510] = 0x55; + fs->currentsector.sector[511] = 0xAA; + + if (fs->disk_io.write_media(sector_lba, fs->currentsector.sector, 1)) + return 1; + else + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_erase_fat: Erase FAT table using fs details in fs struct +//----------------------------------------------------------------------------- +static int fatfs_erase_fat(struct fatfs *fs, int is_fat32) +{ + uint32 i; + + // Zero sector initially + memset(fs->currentsector.sector, 0, FAT_SECTOR_SIZE); + + // Initialise default allocate / reserved clusters + if (!is_fat32) + { + SET_16BIT_WORD(fs->currentsector.sector, 0, 0xFFF8); + SET_16BIT_WORD(fs->currentsector.sector, 2, 0xFFFF); + } + else + { + SET_32BIT_WORD(fs->currentsector.sector, 0, 0x0FFFFFF8); + SET_32BIT_WORD(fs->currentsector.sector, 4, 0xFFFFFFFF); + SET_32BIT_WORD(fs->currentsector.sector, 8, 0x0FFFFFFF); + } + + if (!fs->disk_io.write_media(fs->fat_begin_lba + 0, fs->currentsector.sector, 1)) + return 0; + + // Zero remaining FAT sectors + memset(fs->currentsector.sector, 0, FAT_SECTOR_SIZE); + for (i=1;ifat_sectors*fs->num_of_fats;i++) + if (!fs->disk_io.write_media(fs->fat_begin_lba + i, fs->currentsector.sector, 1)) + return 0; + + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_format_fat16: Format a FAT16 partition +//----------------------------------------------------------------------------- +int fatfs_format_fat16(struct fatfs *fs, uint32 volume_sectors, const char *name) +{ + fs->currentsector.address = FAT32_INVALID_CLUSTER; + fs->currentsector.dirty = 0; + + fs->next_free_cluster = 0; // Invalid + + fatfs_fat_init(fs); + + // Make sure we have read + write functions + if (!fs->disk_io.read_media || !fs->disk_io.write_media) + return FAT_INIT_MEDIA_ACCESS_ERROR; + + // Volume is FAT16 + fs->fat_type = FAT_TYPE_16; + + // Not valid for FAT16 + fs->fs_info_sector = 0; + fs->rootdir_first_cluster = 0; + + // Sector 0: Boot sector + // NOTE: We don't need an MBR, it is a waste of a good sector! + fs->lba_begin = 0; + if (!fatfs_create_boot_sector(fs, fs->lba_begin, volume_sectors, name, 0)) + return 0; + + // For FAT16 (which this may be), rootdir_first_cluster is actuall rootdir_first_sector + fs->rootdir_first_sector = fs->reserved_sectors + (fs->num_of_fats * fs->fat_sectors); + fs->rootdir_sectors = ((fs->root_entry_count * 32) + (FAT_SECTOR_SIZE - 1)) / FAT_SECTOR_SIZE; + + // First FAT LBA address + fs->fat_begin_lba = fs->lba_begin + fs->reserved_sectors; + + // The address of the first data cluster on this volume + fs->cluster_begin_lba = fs->fat_begin_lba + (fs->num_of_fats * fs->fat_sectors); + + // Initialise FAT sectors + if (!fatfs_erase_fat(fs, 0)) + return 0; + + // Erase Root directory + if (!fatfs_erase_sectors(fs, fs->lba_begin + fs->rootdir_first_sector, fs->rootdir_sectors)) + return 0; + + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_format_fat32: Format a FAT32 partition +//----------------------------------------------------------------------------- +int fatfs_format_fat32(struct fatfs *fs, uint32 volume_sectors, const char *name) +{ + fs->currentsector.address = FAT32_INVALID_CLUSTER; + fs->currentsector.dirty = 0; + + fs->next_free_cluster = 0; // Invalid + + fatfs_fat_init(fs); + + // Make sure we have read + write functions + if (!fs->disk_io.read_media || !fs->disk_io.write_media) + return FAT_INIT_MEDIA_ACCESS_ERROR; + + // Volume is FAT32 + fs->fat_type = FAT_TYPE_32; + + // Basic defaults for normal FAT32 partitions + fs->fs_info_sector = 1; + fs->rootdir_first_cluster = 2; + + // Sector 0: Boot sector + // NOTE: We don't need an MBR, it is a waste of a good sector! + fs->lba_begin = 0; + if (!fatfs_create_boot_sector(fs, fs->lba_begin, volume_sectors, name, 1)) + return 0; + + // First FAT LBA address + fs->fat_begin_lba = fs->lba_begin + fs->reserved_sectors; + + // The address of the first data cluster on this volume + fs->cluster_begin_lba = fs->fat_begin_lba + (fs->num_of_fats * fs->fat_sectors); + + // Initialise FSInfo sector + if (!fatfs_create_fsinfo_sector(fs, fs->fs_info_sector)) + return 0; + + // Initialise FAT sectors + if (!fatfs_erase_fat(fs, 1)) + return 0; + + // Erase Root directory + if (!fatfs_erase_sectors(fs, fatfs_lba_of_cluster(fs, fs->rootdir_first_cluster), fs->sectors_per_cluster)) + return 0; + + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_format: Format a partition with either FAT16 or FAT32 based on size +//----------------------------------------------------------------------------- +int fatfs_format(struct fatfs *fs, uint32 volume_sectors, const char *name) +{ + // 2GB - 32K limit for safe behaviour for FAT16 + if (volume_sectors <= 4194304) + return fatfs_format_fat16(fs, volume_sectors, name); + else + return fatfs_format_fat32(fs, volume_sectors, name); +} +#endif /*FATFS_INC_FORMAT_SUPPORT*/ diff --git a/src/gui/Lib/fat_io_lib/fat_format.h b/src/gui/Lib/fat_io_lib/fat_format.h new file mode 100644 index 0000000..a8a6bba --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_format.h @@ -0,0 +1,15 @@ +#ifndef __FAT_FORMAT_H__ +#define __FAT_FORMAT_H__ + +#include "fat_defs.h" +#include "fat_opts.h" +#include "fat_access.h" + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- +int fatfs_format(struct fatfs *fs, uint32 volume_sectors, const char *name); +int fatfs_format_fat16(struct fatfs *fs, uint32 volume_sectors, const char *name); +int fatfs_format_fat32(struct fatfs *fs, uint32 volume_sectors, const char *name); + +#endif diff --git a/src/gui/Lib/fat_io_lib/fat_list.h b/src/gui/Lib/fat_io_lib/fat_list.h new file mode 100644 index 0000000..bd386ef --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_list.h @@ -0,0 +1,161 @@ +#ifndef __FAT_LIST_H__ +#define __FAT_LIST_H__ + +#ifndef FAT_ASSERT + #define FAT_ASSERT(x) +#endif + +#ifndef FAT_INLINE + #define FAT_INLINE +#endif + +//----------------------------------------------------------------- +// Types +//----------------------------------------------------------------- +struct fat_list; + +struct fat_node +{ + struct fat_node *previous; + struct fat_node *next; +}; + +struct fat_list +{ + struct fat_node *head; + struct fat_node *tail; +}; + +//----------------------------------------------------------------- +// Macros +//----------------------------------------------------------------- +#define fat_list_entry(p, t, m) p ? ((t *)((char *)(p)-(char*)(&((t *)0)->m))) : 0 +#define fat_list_next(l, p) (p)->next +#define fat_list_prev(l, p) (p)->previous +#define fat_list_first(l) (l)->head +#define fat_list_last(l) (l)->tail +#define fat_list_for_each(l, p) for ((p) = (l)->head; (p); (p) = (p)->next) + +//----------------------------------------------------------------- +// Inline Functions +//----------------------------------------------------------------- + +//----------------------------------------------------------------- +// fat_list_init: +//----------------------------------------------------------------- +static FAT_INLINE void fat_list_init(struct fat_list *list) +{ + FAT_ASSERT(list); + + list->head = list->tail = 0; +} +//----------------------------------------------------------------- +// fat_list_remove: +//----------------------------------------------------------------- +static FAT_INLINE void fat_list_remove(struct fat_list *list, struct fat_node *node) +{ + FAT_ASSERT(list); + FAT_ASSERT(node); + + if(!node->previous) + list->head = node->next; + else + node->previous->next = node->next; + + if(!node->next) + list->tail = node->previous; + else + node->next->previous = node->previous; +} +//----------------------------------------------------------------- +// fat_list_insert_after: +//----------------------------------------------------------------- +static FAT_INLINE void fat_list_insert_after(struct fat_list *list, struct fat_node *node, struct fat_node *new_node) +{ + FAT_ASSERT(list); + FAT_ASSERT(node); + FAT_ASSERT(new_node); + + new_node->previous = node; + new_node->next = node->next; + if (!node->next) + list->tail = new_node; + else + node->next->previous = new_node; + node->next = new_node; +} +//----------------------------------------------------------------- +// fat_list_insert_before: +//----------------------------------------------------------------- +static FAT_INLINE void fat_list_insert_before(struct fat_list *list, struct fat_node *node, struct fat_node *new_node) +{ + FAT_ASSERT(list); + FAT_ASSERT(node); + FAT_ASSERT(new_node); + + new_node->previous = node->previous; + new_node->next = node; + if (!node->previous) + list->head = new_node; + else + node->previous->next = new_node; + node->previous = new_node; +} +//----------------------------------------------------------------- +// fat_list_insert_first: +//----------------------------------------------------------------- +static FAT_INLINE void fat_list_insert_first(struct fat_list *list, struct fat_node *node) +{ + FAT_ASSERT(list); + FAT_ASSERT(node); + + if (!list->head) + { + list->head = node; + list->tail = node; + node->previous = 0; + node->next = 0; + } + else + fat_list_insert_before(list, list->head, node); +} +//----------------------------------------------------------------- +// fat_list_insert_last: +//----------------------------------------------------------------- +static FAT_INLINE void fat_list_insert_last(struct fat_list *list, struct fat_node *node) +{ + FAT_ASSERT(list); + FAT_ASSERT(node); + + if (!list->tail) + fat_list_insert_first(list, node); + else + fat_list_insert_after(list, list->tail, node); +} +//----------------------------------------------------------------- +// fat_list_is_empty: +//----------------------------------------------------------------- +static FAT_INLINE int fat_list_is_empty(struct fat_list *list) +{ + FAT_ASSERT(list); + + return !list->head; +} +//----------------------------------------------------------------- +// fat_list_pop_head: +//----------------------------------------------------------------- +static FAT_INLINE struct fat_node * fat_list_pop_head(struct fat_list *list) +{ + struct fat_node * node; + + FAT_ASSERT(list); + + node = fat_list_first(list); + if (node) + fat_list_remove(list, node); + + return node; +} + +#endif + diff --git a/src/gui/Lib/fat_io_lib/fat_misc.c b/src/gui/Lib/fat_io_lib/fat_misc.c new file mode 100644 index 0000000..cbf6f08 --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_misc.c @@ -0,0 +1,505 @@ +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// FAT16/32 File IO Library +// V2.6 +// Ultra-Embedded.com +// Copyright 2003 - 2012 +// +// Email: admin@ultra-embedded.com +// +// License: GPL +// If you would like a version with a more permissive license for use in +// closed source commercial applications please contact me for details. +//----------------------------------------------------------------------------- +// +// This file is part of FAT File IO Library. +// +// FAT File IO Library is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// FAT File IO Library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with FAT File IO Library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#include +#include +#include "fat_misc.h" + +//----------------------------------------------------------------------------- +// fatfs_lfn_cache_init: Clear long file name cache +//----------------------------------------------------------------------------- +void fatfs_lfn_cache_init(struct lfn_cache *lfn, int wipeTable) +{ + int i = 0; + + lfn->no_of_strings = 0; + +#if FATFS_INC_LFN_SUPPORT + + // Zero out buffer also + if (wipeTable) + for (i=0;iString[i], 0x00, MAX_LFN_ENTRY_LENGTH); +#endif +} +//----------------------------------------------------------------------------- +// fatfs_lfn_cache_entry - Function extracts long file name text from sector +// at a specific offset +//----------------------------------------------------------------------------- +#if FATFS_INC_LFN_SUPPORT +void fatfs_lfn_cache_entry(struct lfn_cache *lfn, uint8 *entryBuffer) +{ + uint8 LFNIndex, i; + LFNIndex = entryBuffer[0] & 0x1F; + + // Limit file name to cache size! + if (LFNIndex > MAX_LONGFILENAME_ENTRIES) + return ; + + // This is an error condition + if (LFNIndex == 0) + return ; + + if (lfn->no_of_strings == 0) + lfn->no_of_strings = LFNIndex; + + lfn->String[LFNIndex-1][0] = entryBuffer[1]; + lfn->String[LFNIndex-1][1] = entryBuffer[3]; + lfn->String[LFNIndex-1][2] = entryBuffer[5]; + lfn->String[LFNIndex-1][3] = entryBuffer[7]; + lfn->String[LFNIndex-1][4] = entryBuffer[9]; + lfn->String[LFNIndex-1][5] = entryBuffer[0x0E]; + lfn->String[LFNIndex-1][6] = entryBuffer[0x10]; + lfn->String[LFNIndex-1][7] = entryBuffer[0x12]; + lfn->String[LFNIndex-1][8] = entryBuffer[0x14]; + lfn->String[LFNIndex-1][9] = entryBuffer[0x16]; + lfn->String[LFNIndex-1][10] = entryBuffer[0x18]; + lfn->String[LFNIndex-1][11] = entryBuffer[0x1C]; + lfn->String[LFNIndex-1][12] = entryBuffer[0x1E]; + + for (i=0; iString[LFNIndex-1][i]==0xFF) + lfn->String[LFNIndex-1][i] = 0x20; // Replace with spaces +} +#endif +//----------------------------------------------------------------------------- +// fatfs_lfn_cache_get: Get a reference to the long filename +//----------------------------------------------------------------------------- +#if FATFS_INC_LFN_SUPPORT +char* fatfs_lfn_cache_get(struct lfn_cache *lfn) +{ + // Null terminate long filename + if (lfn->no_of_strings == MAX_LONGFILENAME_ENTRIES) + lfn->Null = '\0'; + else if (lfn->no_of_strings) + lfn->String[lfn->no_of_strings][0] = '\0'; + else + lfn->String[0][0] = '\0'; + + return (char*)&lfn->String[0][0]; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_entry_lfn_text: If LFN text entry found +//----------------------------------------------------------------------------- +#if FATFS_INC_LFN_SUPPORT +int fatfs_entry_lfn_text(struct fat_dir_entry *entry) +{ + if ((entry->Attr & FILE_ATTR_LFN_TEXT) == FILE_ATTR_LFN_TEXT) + return 1; + else + return 0; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_entry_lfn_invalid: If SFN found not relating to LFN +//----------------------------------------------------------------------------- +#if FATFS_INC_LFN_SUPPORT +int fatfs_entry_lfn_invalid(struct fat_dir_entry *entry) +{ + if ( (entry->Name[0]==FILE_HEADER_BLANK) || + (entry->Name[0]==FILE_HEADER_DELETED)|| + (entry->Attr==FILE_ATTR_VOLUME_ID) || + (entry->Attr & FILE_ATTR_SYSHID) ) + return 1; + else + return 0; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_entry_lfn_exists: If LFN exists and correlation SFN found +//----------------------------------------------------------------------------- +#if FATFS_INC_LFN_SUPPORT +int fatfs_entry_lfn_exists(struct lfn_cache *lfn, struct fat_dir_entry *entry) +{ + if ( (entry->Attr!=FILE_ATTR_LFN_TEXT) && + (entry->Name[0]!=FILE_HEADER_BLANK) && + (entry->Name[0]!=FILE_HEADER_DELETED) && + (entry->Attr!=FILE_ATTR_VOLUME_ID) && + (!(entry->Attr&FILE_ATTR_SYSHID)) && + (lfn->no_of_strings) ) + return 1; + else + return 0; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_entry_sfn_only: If SFN only exists +//----------------------------------------------------------------------------- +int fatfs_entry_sfn_only(struct fat_dir_entry *entry) +{ + if ( (entry->Attr!=FILE_ATTR_LFN_TEXT) && + (entry->Name[0]!=FILE_HEADER_BLANK) && + (entry->Name[0]!=FILE_HEADER_DELETED) && + (entry->Attr!=FILE_ATTR_VOLUME_ID) && + (!(entry->Attr&FILE_ATTR_SYSHID)) ) + return 1; + else + return 0; +} +// TODO: FILE_ATTR_SYSHID ?!?!??! +//----------------------------------------------------------------------------- +// fatfs_entry_is_dir: Returns 1 if a directory +//----------------------------------------------------------------------------- +int fatfs_entry_is_dir(struct fat_dir_entry *entry) +{ + if (entry->Attr & FILE_TYPE_DIR) + return 1; + else + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_entry_is_file: Returns 1 is a file entry +//----------------------------------------------------------------------------- +int fatfs_entry_is_file(struct fat_dir_entry *entry) +{ + if (entry->Attr & FILE_TYPE_FILE) + return 1; + else + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_lfn_entries_required: Calculate number of 13 characters entries +//----------------------------------------------------------------------------- +#if FATFS_INC_LFN_SUPPORT +int fatfs_lfn_entries_required(char *filename) +{ + int length = (int)strlen(filename); + + if (length) + return (length + MAX_LFN_ENTRY_LENGTH - 1) / MAX_LFN_ENTRY_LENGTH; + else + return 0; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_filename_to_lfn: +//----------------------------------------------------------------------------- +#if FATFS_INC_LFN_SUPPORT +void fatfs_filename_to_lfn(char *filename, uint8 *buffer, int entry, uint8 sfnChk) +{ + int i; + int nameIndexes[MAX_LFN_ENTRY_LENGTH] = {1,3,5,7,9,0x0E,0x10,0x12,0x14,0x16,0x18,0x1C,0x1E}; + + // 13 characters entries + int length = (int)strlen(filename); + int entriesRequired = fatfs_lfn_entries_required(filename); + + // Filename offset + int start = entry * MAX_LFN_ENTRY_LENGTH; + + // Initialise to zeros + memset(buffer, 0x00, FAT_DIR_ENTRY_SIZE); + + // LFN entry number + buffer[0] = (uint8)(((entriesRequired-1)==entry)?(0x40|(entry+1)):(entry+1)); + + // LFN flag + buffer[11] = 0x0F; + + // Checksum of short filename + buffer[13] = sfnChk; + + // Copy to buffer + for (i=0;iName[i] = shortfilename[i]; + + // Unless we have a RTC we might as well set these to 1980 + entry->CrtTimeTenth = 0x00; + entry->CrtTime[1] = entry->CrtTime[0] = 0x00; + entry->CrtDate[1] = 0x00; + entry->CrtDate[0] = 0x20; + entry->LstAccDate[1] = 0x00; + entry->LstAccDate[0] = 0x20; + entry->WrtTime[1] = entry->WrtTime[0] = 0x00; + entry->WrtDate[1] = 0x00; + entry->WrtDate[0] = 0x20; + + if (!dir) + entry->Attr = FILE_TYPE_FILE; + else + entry->Attr = FILE_TYPE_DIR; + + entry->NTRes = 0x00; + + entry->FstClusHI = FAT_HTONS((uint16)((startCluster>>16) & 0xFFFF)); + entry->FstClusLO = FAT_HTONS((uint16)((startCluster>>0) & 0xFFFF)); + entry->FileSize = FAT_HTONL(size); +} +#endif +//----------------------------------------------------------------------------- +// fatfs_lfn_create_sfn: Create a padded SFN +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fatfs_lfn_create_sfn(char *sfn_output, char *filename) +{ + int i; + int dotPos = -1; + char ext[3]; + int pos; + int len = (int)strlen(filename); + + // Invalid to start with . + if (filename[0]=='.') + return 0; + + memset(sfn_output, ' ', FAT_SFN_SIZE_FULL); + memset(ext, ' ', 3); + + // Find dot seperator + for (i = 0; i< len; i++) + { + if (filename[i]=='.') + dotPos = i; + } + + // Extract extensions + if (dotPos!=-1) + { + // Copy first three chars of extension + for (i = (dotPos+1); i < (dotPos+1+3); i++) + if (i= 'a' && filename[i] <= 'z') + sfn_output[pos++] = filename[i] - 'a' + 'A'; + else + sfn_output[pos++] = filename[i]; + } + + // Fill upto 8 characters + if (pos==FAT_SFN_SIZE_PARTIAL) + break; + } + + // Add extension part + for (i=FAT_SFN_SIZE_PARTIAL;i= 'a' && ext[i-FAT_SFN_SIZE_PARTIAL] <= 'z') + sfn_output[i] = ext[i-FAT_SFN_SIZE_PARTIAL] - 'a' + 'A'; + else + sfn_output[i] = ext[i-FAT_SFN_SIZE_PARTIAL]; + } + + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_itoa: +//----------------------------------------------------------------------------- +static void fatfs_itoa(uint32 num, char *s) +{ + char* cp; + char outbuf[12]; + const char digits[] = "0123456789ABCDEF"; + + // Build string backwards + cp = outbuf; + do + { + *cp++ = digits[(int)(num % 10)]; + } + while ((num /= 10) > 0); + + *cp-- = 0; + + // Copy in forwards + while (cp >= outbuf) + *s++ = *cp--; + + *s = 0; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_lfn_generate_tail: +// sfn_input = Input short filename, spaced format & in upper case +// sfn_output = Output short filename with tail +//----------------------------------------------------------------------------- +#if FATFS_INC_LFN_SUPPORT +#if FATFS_INC_WRITE_SUPPORT +int fatfs_lfn_generate_tail(char *sfn_output, char *sfn_input, uint32 tailNum) +{ + int tail_chars; + char tail_str[12]; + + if (tailNum > 99999) + return 0; + + // Convert to number + memset(tail_str, 0x00, sizeof(tail_str)); + tail_str[0] = '~'; + fatfs_itoa(tailNum, tail_str+1); + + // Copy in base filename + memcpy(sfn_output, sfn_input, FAT_SFN_SIZE_FULL); + + // Overwrite with tail + tail_chars = (int)strlen(tail_str); + memcpy(sfn_output+(FAT_SFN_SIZE_PARTIAL-tail_chars), tail_str, tail_chars); + + return 1; +} +#endif +#endif +//----------------------------------------------------------------------------- +// fatfs_convert_from_fat_time: Convert FAT time to h/m/s +//----------------------------------------------------------------------------- +#if FATFS_INC_TIME_DATE_SUPPORT +void fatfs_convert_from_fat_time(uint16 fat_time, int *hours, int *minutes, int *seconds) +{ + *hours = (fat_time >> FAT_TIME_HOURS_SHIFT) & FAT_TIME_HOURS_MASK; + *minutes = (fat_time >> FAT_TIME_MINUTES_SHIFT) & FAT_TIME_MINUTES_MASK; + *seconds = (fat_time >> FAT_TIME_SECONDS_SHIFT) & FAT_TIME_SECONDS_MASK; + *seconds = *seconds * FAT_TIME_SECONDS_SCALE; +} +//----------------------------------------------------------------------------- +// fatfs_convert_from_fat_date: Convert FAT date to d/m/y +//----------------------------------------------------------------------------- +void fatfs_convert_from_fat_date(uint16 fat_date, int *day, int *month, int *year) +{ + *day = (fat_date >> FAT_DATE_DAY_SHIFT) & FAT_DATE_DAY_MASK; + *month = (fat_date >> FAT_DATE_MONTH_SHIFT) & FAT_DATE_MONTH_MASK; + *year = (fat_date >> FAT_DATE_YEAR_SHIFT) & FAT_DATE_YEAR_MASK; + *year = *year + FAT_DATE_YEAR_OFFSET; +} +//----------------------------------------------------------------------------- +// fatfs_convert_to_fat_time: Convert h/m/s to FAT time +//----------------------------------------------------------------------------- +uint16 fatfs_convert_to_fat_time(int hours, int minutes, int seconds) +{ + uint16 fat_time = 0; + + // Most FAT times are to a resolution of 2 seconds + seconds /= FAT_TIME_SECONDS_SCALE; + + fat_time = (hours & FAT_TIME_HOURS_MASK) << FAT_TIME_HOURS_SHIFT; + fat_time|= (minutes & FAT_TIME_MINUTES_MASK) << FAT_TIME_MINUTES_SHIFT; + fat_time|= (seconds & FAT_TIME_SECONDS_MASK) << FAT_TIME_SECONDS_SHIFT; + + return fat_time; +} +//----------------------------------------------------------------------------- +// fatfs_convert_to_fat_date: Convert d/m/y to FAT date +//----------------------------------------------------------------------------- +uint16 fatfs_convert_to_fat_date(int day, int month, int year) +{ + uint16 fat_date = 0; + + // FAT dates are relative to 1980 + if (year >= FAT_DATE_YEAR_OFFSET) + year -= FAT_DATE_YEAR_OFFSET; + + fat_date = (day & FAT_DATE_DAY_MASK) << FAT_DATE_DAY_SHIFT; + fat_date|= (month & FAT_DATE_MONTH_MASK) << FAT_DATE_MONTH_SHIFT; + fat_date|= (year & FAT_DATE_YEAR_MASK) << FAT_DATE_YEAR_SHIFT; + + return fat_date; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_print_sector: +//----------------------------------------------------------------------------- +#ifdef FATFS_DEBUG +void fatfs_print_sector(uint32 sector, uint8 *data) +{ + int i; + int j; + + FAT_PRINTF(("Sector %d:\n", sector)); + + for (i=0;i 31 && ch < 127) + { + FAT_PRINTF(("%c", ch)); + } + else + { + FAT_PRINTF((".")); + } + } + + FAT_PRINTF(("\n")); + } + } +} +#endif diff --git a/src/gui/Lib/fat_io_lib/fat_misc.h b/src/gui/Lib/fat_io_lib/fat_misc.h new file mode 100644 index 0000000..0c02634 --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_misc.h @@ -0,0 +1,63 @@ +#ifndef __FAT_MISC_H__ +#define __FAT_MISC_H__ + +#include "fat_defs.h" +#include "fat_opts.h" + +//----------------------------------------------------------------------------- +// Defines +//----------------------------------------------------------------------------- +#define MAX_LONGFILENAME_ENTRIES 20 +#define MAX_LFN_ENTRY_LENGTH 13 + +//----------------------------------------------------------------------------- +// Macros +//----------------------------------------------------------------------------- +#define GET_32BIT_WORD(buffer, location) ( ((uint32)buffer[location+3]<<24) + ((uint32)buffer[location+2]<<16) + ((uint32)buffer[location+1]<<8) + (uint32)buffer[location+0] ) +#define GET_16BIT_WORD(buffer, location) ( ((uint16)buffer[location+1]<<8) + (uint16)buffer[location+0] ) + +#define SET_32BIT_WORD(buffer, location, value) { buffer[location+0] = (uint8)((value)&0xFF); \ + buffer[location+1] = (uint8)((value>>8)&0xFF); \ + buffer[location+2] = (uint8)((value>>16)&0xFF); \ + buffer[location+3] = (uint8)((value>>24)&0xFF); } + +#define SET_16BIT_WORD(buffer, location, value) { buffer[location+0] = (uint8)((value)&0xFF); \ + buffer[location+1] = (uint8)((value>>8)&0xFF); } + +//----------------------------------------------------------------------------- +// Structures +//----------------------------------------------------------------------------- +struct lfn_cache +{ +#if FATFS_INC_LFN_SUPPORT + // Long File Name Structure (max 260 LFN length) + uint8 String[MAX_LONGFILENAME_ENTRIES][MAX_LFN_ENTRY_LENGTH]; + uint8 Null; +#endif + uint8 no_of_strings; +}; + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- +void fatfs_lfn_cache_init(struct lfn_cache *lfn, int wipeTable); +void fatfs_lfn_cache_entry(struct lfn_cache *lfn, uint8 *entryBuffer); +char* fatfs_lfn_cache_get(struct lfn_cache *lfn); +int fatfs_entry_lfn_text(struct fat_dir_entry *entry); +int fatfs_entry_lfn_invalid(struct fat_dir_entry *entry); +int fatfs_entry_lfn_exists(struct lfn_cache *lfn, struct fat_dir_entry *entry); +int fatfs_entry_sfn_only(struct fat_dir_entry *entry); +int fatfs_entry_is_dir(struct fat_dir_entry *entry); +int fatfs_entry_is_file(struct fat_dir_entry *entry); +int fatfs_lfn_entries_required(char *filename); +void fatfs_filename_to_lfn(char *filename, uint8 *buffer, int entry, uint8 sfnChk); +void fatfs_sfn_create_entry(char *shortfilename, uint32 size, uint32 startCluster, struct fat_dir_entry *entry, int dir); +int fatfs_lfn_create_sfn(char *sfn_output, char *filename); +int fatfs_lfn_generate_tail(char *sfn_output, char *sfn_input, uint32 tailNum); +void fatfs_convert_from_fat_time(uint16 fat_time, int *hours, int *minutes, int *seconds); +void fatfs_convert_from_fat_date(uint16 fat_date, int *day, int *month, int *year); +uint16 fatfs_convert_to_fat_time(int hours, int minutes, int seconds); +uint16 fatfs_convert_to_fat_date(int day, int month, int year); +void fatfs_print_sector(uint32 sector, uint8 *data); + +#endif diff --git a/src/gui/Lib/fat_io_lib/fat_opts.h b/src/gui/Lib/fat_io_lib/fat_opts.h new file mode 100644 index 0000000..a7a7385 --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_opts.h @@ -0,0 +1,83 @@ +#ifndef __FAT_OPTS_H__ +#define __FAT_OPTS_H__ + +#ifdef FATFS_USE_CUSTOM_OPTS_FILE + #include "fat_custom.h" +#endif + +//------------------------------------------------------------- +// Configuration +//------------------------------------------------------------- + +// Is the processor little endian (1) or big endian (0) +#ifndef FATFS_IS_LITTLE_ENDIAN + #define FATFS_IS_LITTLE_ENDIAN 1 +#endif + +// Max filename Length +#ifndef FATFS_MAX_LONG_FILENAME + #define FATFS_MAX_LONG_FILENAME 260 +#endif + +// Max open files (reduce to lower memory requirements) +#ifndef FATFS_MAX_OPEN_FILES + #define FATFS_MAX_OPEN_FILES 2 +#endif + +// Number of sectors per FAT_BUFFER (min 1) +#ifndef FAT_BUFFER_SECTORS + #define FAT_BUFFER_SECTORS 1 +#endif + +// Max FAT sectors to buffer (min 1) +// (mem used is FAT_BUFFERS * FAT_BUFFER_SECTORS * FAT_SECTOR_SIZE) +#ifndef FAT_BUFFERS + #define FAT_BUFFERS 1 +#endif + +// Size of cluster chain cache (can be undefined) +// Mem used = FAT_CLUSTER_CACHE_ENTRIES * 4 * 2 +// Improves access speed considerably +//#define FAT_CLUSTER_CACHE_ENTRIES 128 + +// Include support for writing files (1 / 0)? +#ifndef FATFS_INC_WRITE_SUPPORT + #define FATFS_INC_WRITE_SUPPORT 1 +#endif + +// Support long filenames (1 / 0)? +// (if not (0) only 8.3 format is supported) +#ifndef FATFS_INC_LFN_SUPPORT + #define FATFS_INC_LFN_SUPPORT 1 +#endif + +// Support directory listing (1 / 0)? +#ifndef FATFS_DIR_LIST_SUPPORT + #define FATFS_DIR_LIST_SUPPORT 1 +#endif + +// Support time/date (1 / 0)? +#ifndef FATFS_INC_TIME_DATE_SUPPORT + #define FATFS_INC_TIME_DATE_SUPPORT 0 +#endif + +// Include support for formatting disks (1 / 0)? +#ifndef FATFS_INC_FORMAT_SUPPORT + #define FATFS_INC_FORMAT_SUPPORT 0 +#endif + +// Sector size used +#define FAT_SECTOR_SIZE 512 + +// Printf output (directory listing / debug) +#ifndef FAT_PRINTF + void hiperiso_syslog_printf(const char *Fmt, ...); + #define FAT_PRINTF(a) hiperiso_syslog_printf a +#endif + +// Time/Date support requires time.h +#if FATFS_INC_TIME_DATE_SUPPORT + #include +#endif + +#endif diff --git a/src/gui/Lib/fat_io_lib/fat_string.c b/src/gui/Lib/fat_io_lib/fat_string.c new file mode 100644 index 0000000..f7206ce --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_string.c @@ -0,0 +1,514 @@ +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// FAT16/32 File IO Library +// V2.6 +// Ultra-Embedded.com +// Copyright 2003 - 2012 +// +// Email: admin@ultra-embedded.com +// +// License: GPL +// If you would like a version with a more permissive license for use in +// closed source commercial applications please contact me for details. +//----------------------------------------------------------------------------- +// +// This file is part of FAT File IO Library. +// +// FAT File IO Library is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// FAT File IO Library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with FAT File IO Library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#include +#include +#include "fat_string.h" + +//----------------------------------------------------------------------------- +// fatfs_total_path_levels: Take a filename and path and count the sub levels +// of folders. E.g. C:\folder\file.zip = 1 level +// Acceptable input formats are: +// c:\folder\file.zip +// /dev/etc/samba.conf +// Returns: -1 = Error, 0 or more = Ok +//----------------------------------------------------------------------------- +int fatfs_total_path_levels(char *path) +{ + int levels = 0; + char expectedchar; + + if (!path) + return -1; + + // Acceptable formats: + // c:\folder\file.zip + // /dev/etc/samba.conf + if (*path == '/') + { + expectedchar = '/'; + path++; + } + else if (path[1] == ':' || path[2] == '\\') + { + expectedchar = '\\'; + path += 3; + } + else + return -1; + + // Count levels in path string + while (*path) + { + // Fast forward through actual subdir text to next slash + for (; *path; ) + { + // If slash detected escape from for loop + if (*path == expectedchar) { path++; break; } + path++; + } + + // Increase number of subdirs founds + levels++; + } + + // Subtract the file itself + return levels-1; +} +//----------------------------------------------------------------------------- +// fatfs_get_substring: Get a substring from 'path' which contains the folder +// (or file) at the specified level. +// E.g. C:\folder\file.zip : Level 0 = C:\folder, Level 1 = file.zip +// Returns: -1 = Error, 0 = Ok +//----------------------------------------------------------------------------- +int fatfs_get_substring(char *path, int levelreq, char *output, int max_len) +{ + int i; + int pathlen=0; + int levels=0; + int copypnt=0; + char expectedchar; + + if (!path || max_len <= 0) + return -1; + + // Acceptable formats: + // c:\folder\file.zip + // /dev/etc/samba.conf + if (*path == '/') + { + expectedchar = '/'; + path++; + } + else if (path[1] == ':' || path[2] == '\\') + { + expectedchar = '\\'; + path += 3; + } + else + return -1; + + // Get string length of path + pathlen = (int)strlen (path); + + // Loop through the number of times as characters in 'path' + for (i = 0; i path = C:\folder filename = file.zip +// E.g. C:\file.zip -> path = [blank] filename = file.zip +//----------------------------------------------------------------------------- +int fatfs_split_path(char *full_path, char *path, int max_path, char *filename, int max_filename) +{ + int strindex; + + // Count the levels to the filepath + int levels = fatfs_total_path_levels(full_path); + if (levels == -1) + return -1; + + // Get filename part of string + if (fatfs_get_substring(full_path, levels, filename, max_filename) != 0) + return -1; + + // If root file + if (levels == 0) + path[0] = '\0'; + else + { + strindex = (int)strlen(full_path) - (int)strlen(filename); + if (strindex > max_path) + strindex = max_path; + + memcpy(path, full_path, strindex); + path[strindex-1] = '\0'; + } + + return 0; +} +//----------------------------------------------------------------------------- +// FileString_StrCmpNoCase: Compare two strings case with case sensitivity +//----------------------------------------------------------------------------- +static int FileString_StrCmpNoCase(char *s1, char *s2, int n) +{ + int diff; + char a,b; + + while (n--) + { + a = *s1; + b = *s2; + + // Make lower case if uppercase + if ((a>='A') && (a<='Z')) + a+= 32; + if ((b>='A') && (b<='Z')) + b+= 32; + + diff = a - b; + + // If different + if (diff) + return diff; + + // If run out of strings + if ( (*s1 == 0) || (*s2 == 0) ) + break; + + s1++; + s2++; + } + return 0; +} +//----------------------------------------------------------------------------- +// FileString_GetExtension: Get index to extension within filename +// Returns -1 if not found or index otherwise +//----------------------------------------------------------------------------- +static int FileString_GetExtension(char *str) +{ + int dotPos = -1; + char *strSrc = str; + + // Find last '.' in string (if at all) + while (*strSrc) + { + if (*strSrc=='.') + dotPos = (int)(strSrc-str); + + strSrc++; + } + + return dotPos; +} +//----------------------------------------------------------------------------- +// FileString_TrimLength: Get length of string excluding trailing spaces +// Returns -1 if not found or index otherwise +//----------------------------------------------------------------------------- +static int FileString_TrimLength(char *str, int strLen) +{ + int length = strLen; + char *strSrc = str+strLen-1; + + // Find last non white space + while (strLen != 0) + { + if (*strSrc == ' ') + length = (int)(strSrc - str); + else + break; + + strSrc--; + strLen--; + } + + return length; +} +//----------------------------------------------------------------------------- +// fatfs_compare_names: Compare two filenames (without copying or changing origonals) +// Returns 1 if match, 0 if not +//----------------------------------------------------------------------------- +int fatfs_compare_names(char* strA, char* strB) +{ + char *ext1 = NULL; + char *ext2 = NULL; + int ext1Pos, ext2Pos; + int file1Len, file2Len; + + // Get both files extension + ext1Pos = FileString_GetExtension(strA); + ext2Pos = FileString_GetExtension(strB); + + // NOTE: Extension position can be different for matching + // filename if trailing space are present before it! + // Check that if one has an extension, so does the other + if ((ext1Pos==-1) && (ext2Pos!=-1)) + return 0; + if ((ext2Pos==-1) && (ext1Pos!=-1)) + return 0; + + // If they both have extensions, compare them + if (ext1Pos!=-1) + { + // Set pointer to start of extension + ext1 = strA+ext1Pos+1; + ext2 = strB+ext2Pos+1; + + // Verify that the file extension lengths match! + if (strlen(ext1) != strlen(ext2)) + return 0; + + // If they dont match + if (FileString_StrCmpNoCase(ext1, ext2, (int)strlen(ext1))!=0) + return 0; + + // Filelength is upto extensions + file1Len = ext1Pos; + file2Len = ext2Pos; + } + // No extensions + else + { + // Filelength is actual filelength + file1Len = (int)strlen(strA); + file2Len = (int)strlen(strB); + } + + // Find length without trailing spaces (before ext) + file1Len = FileString_TrimLength(strA, file1Len); + file2Len = FileString_TrimLength(strB, file2Len); + + // Check the file lengths match + if (file1Len!=file2Len) + return 0; + + // Compare main part of filenames + if (FileString_StrCmpNoCase(strA, strB, file1Len)!=0) + return 0; + else + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_string_ends_with_slash: Does the string end with a slash (\ or /) +//----------------------------------------------------------------------------- +int fatfs_string_ends_with_slash(char *path) +{ + if (path) + { + while (*path) + { + // Last character? + if (!(*(path+1))) + { + if (*path == '\\' || *path == '/') + return 1; + } + + path++; + } + } + + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_get_sfn_display_name: Get display name for SFN entry +//----------------------------------------------------------------------------- +int fatfs_get_sfn_display_name(char* out, char* in) +{ + int len = 0; + while (*in && len <= 11) + { + char a = *in++; + + if (a == ' ') + continue; + // Make lower case if uppercase + else if ((a>='A') && (a<='Z')) + a+= 32; + + *out++ = a; + len++; + } + + *out = '\0'; + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_get_extension: Get extension of filename passed in 'filename'. +// Returned extension is always lower case. +// Returns: 1 if ok, 0 if not. +//----------------------------------------------------------------------------- +int fatfs_get_extension(char* filename, char* out, int maxlen) +{ + int len = 0; + + // Get files extension offset + int ext_pos = FileString_GetExtension(filename); + + if (ext_pos > 0 && out && maxlen) + { + filename += ext_pos + 1; + + while (*filename && len < (maxlen-1)) + { + char a = *filename++; + + // Make lowercase if uppercase + if ((a>='A') && (a<='Z')) + a+= 32; + + *out++ = a; + len++; + } + + *out = '\0'; + return 1; + } + + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_create_path_string: Append path & filename to create file path string. +// Returns: 1 if ok, 0 if not. +//----------------------------------------------------------------------------- +int fatfs_create_path_string(char* path, char *filename, char* out, int maxlen) +{ + int len = 0; + char last = 0; + char seperator = '/'; + + if (path && filename && out && maxlen > 0) + { + while (*path && len < (maxlen-2)) + { + last = *path++; + if (last == '\\') + seperator = '\\'; + *out++ = last; + len++; + } + + // Add a seperator if trailing one not found + if (last != '\\' && last != '/') + *out++ = seperator; + + while (*filename && len < (maxlen-1)) + { + *out++ = *filename++; + len++; + } + + *out = '\0'; + + return 1; + } + + return 0; +} +//----------------------------------------------------------------------------- +// Test Bench +//----------------------------------------------------------------------------- +#ifdef FAT_STRING_TESTBENCH +void main(void) +{ + char output[255]; + char output2[255]; + + assert(fatfs_total_path_levels("C:\\folder\\file.zip") == 1); + assert(fatfs_total_path_levels("C:\\file.zip") == 0); + assert(fatfs_total_path_levels("C:\\folder\\folder2\\file.zip") == 2); + assert(fatfs_total_path_levels("C:\\") == -1); + assert(fatfs_total_path_levels("") == -1); + assert(fatfs_total_path_levels("/dev/etc/file.zip") == 2); + assert(fatfs_total_path_levels("/dev/file.zip") == 1); + + assert(fatfs_get_substring("C:\\folder\\file.zip", 0, output, sizeof(output)) == 0); + assert(strcmp(output, "folder") == 0); + + assert(fatfs_get_substring("C:\\folder\\file.zip", 1, output, sizeof(output)) == 0); + assert(strcmp(output, "file.zip") == 0); + + assert(fatfs_get_substring("/dev/etc/file.zip", 0, output, sizeof(output)) == 0); + assert(strcmp(output, "dev") == 0); + + assert(fatfs_get_substring("/dev/etc/file.zip", 1, output, sizeof(output)) == 0); + assert(strcmp(output, "etc") == 0); + + assert(fatfs_get_substring("/dev/etc/file.zip", 2, output, sizeof(output)) == 0); + assert(strcmp(output, "file.zip") == 0); + + assert(fatfs_split_path("C:\\folder\\file.zip", output, sizeof(output), output2, sizeof(output2)) == 0); + assert(strcmp(output, "C:\\folder") == 0); + assert(strcmp(output2, "file.zip") == 0); + + assert(fatfs_split_path("C:\\file.zip", output, sizeof(output), output2, sizeof(output2)) == 0); + assert(output[0] == 0); + assert(strcmp(output2, "file.zip") == 0); + + assert(fatfs_split_path("/dev/etc/file.zip", output, sizeof(output), output2, sizeof(output2)) == 0); + assert(strcmp(output, "/dev/etc") == 0); + assert(strcmp(output2, "file.zip") == 0); + + assert(FileString_GetExtension("C:\\file.zip") == strlen("C:\\file")); + assert(FileString_GetExtension("C:\\file.zip.ext") == strlen("C:\\file.zip")); + assert(FileString_GetExtension("C:\\file.zip.") == strlen("C:\\file.zip")); + + assert(FileString_TrimLength("C:\\file.zip", strlen("C:\\file.zip")) == strlen("C:\\file.zip")); + assert(FileString_TrimLength("C:\\file.zip ", strlen("C:\\file.zip ")) == strlen("C:\\file.zip")); + assert(FileString_TrimLength(" ", strlen(" ")) == 0); + + assert(fatfs_compare_names("C:\\file.ext", "C:\\file.ext") == 1); + assert(fatfs_compare_names("C:\\file2.ext", "C:\\file.ext") == 0); + assert(fatfs_compare_names("C:\\file .ext", "C:\\file.ext") == 1); + assert(fatfs_compare_names("C:\\file .ext", "C:\\file2.ext") == 0); + + assert(fatfs_string_ends_with_slash("C:\\folder") == 0); + assert(fatfs_string_ends_with_slash("C:\\folder\\") == 1); + assert(fatfs_string_ends_with_slash("/path") == 0); + assert(fatfs_string_ends_with_slash("/path/a") == 0); + assert(fatfs_string_ends_with_slash("/path/") == 1); + + assert(fatfs_get_extension("/mypath/file.wav", output, 4) == 1); + assert(strcmp(output, "wav") == 0); + assert(fatfs_get_extension("/mypath/file.WAV", output, 4) == 1); + assert(strcmp(output, "wav") == 0); + assert(fatfs_get_extension("/mypath/file.zip", output, 4) == 1); + assert(strcmp(output, "ext") != 0); + + assert(fatfs_create_path_string("/mydir1", "myfile.txt", output, sizeof(output)) == 1); + assert(strcmp(output, "/mydir1/myfile.txt") == 0); + assert(fatfs_create_path_string("/mydir2/", "myfile2.txt", output, sizeof(output)) == 1); + assert(strcmp(output, "/mydir2/myfile2.txt") == 0); + assert(fatfs_create_path_string("C:\\mydir3", "myfile3.txt", output, sizeof(output)) == 1); + assert(strcmp(output, "C:\\mydir3\\myfile3.txt") == 0); +} +#endif diff --git a/src/gui/Lib/fat_io_lib/fat_string.h b/src/gui/Lib/fat_io_lib/fat_string.h new file mode 100644 index 0000000..90ca8e0 --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_string.h @@ -0,0 +1,20 @@ +#ifndef __FILESTRING_H__ +#define __FILESTRING_H__ + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- +int fatfs_total_path_levels(char *path); +int fatfs_get_substring(char *Path, int levelreq, char *output, int max_len); +int fatfs_split_path(char *FullPath, char *Path, int max_path, char *FileName, int max_filename); +int fatfs_compare_names(char* strA, char* strB); +int fatfs_string_ends_with_slash(char *path); +int fatfs_get_sfn_display_name(char* out, char* in); +int fatfs_get_extension(char* filename, char* out, int maxlen); +int fatfs_create_path_string(char* path, char *filename, char* out, int maxlen); + +#ifndef NULL + #define NULL 0 +#endif + +#endif diff --git a/src/gui/Lib/fat_io_lib/fat_table.c b/src/gui/Lib/fat_io_lib/fat_table.c new file mode 100644 index 0000000..8d05d3b --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_table.c @@ -0,0 +1,478 @@ +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// FAT16/32 File IO Library +// V2.6 +// Ultra-Embedded.com +// Copyright 2003 - 2012 +// +// Email: admin@ultra-embedded.com +// +// License: GPL +// If you would like a version with a more permissive license for use in +// closed source commercial applications please contact me for details. +//----------------------------------------------------------------------------- +// +// This file is part of FAT File IO Library. +// +// FAT File IO Library is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// FAT File IO Library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with FAT File IO Library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#include +#include "fat_defs.h" +#include "fat_access.h" +#include "fat_table.h" + +#ifndef FAT_BUFFERS + #define FAT_BUFFERS 1 +#endif + +#ifndef FAT_BUFFER_SECTORS + #define FAT_BUFFER_SECTORS 1 +#endif + +#if FAT_BUFFERS < 1 || FAT_BUFFER_SECTORS < 1 + #error "FAT_BUFFERS & FAT_BUFFER_SECTORS must be at least 1" +#endif + +//----------------------------------------------------------------------------- +// FAT Sector Buffer +//----------------------------------------------------------------------------- +#define FAT32_GET_32BIT_WORD(pbuf, location) ( GET_32BIT_WORD(pbuf->ptr, location) ) +#define FAT32_SET_32BIT_WORD(pbuf, location, value) { SET_32BIT_WORD(pbuf->ptr, location, value); pbuf->dirty = 1; } +#define FAT16_GET_16BIT_WORD(pbuf, location) ( GET_16BIT_WORD(pbuf->ptr, location) ) +#define FAT16_SET_16BIT_WORD(pbuf, location, value) { SET_16BIT_WORD(pbuf->ptr, location, value); pbuf->dirty = 1; } + +//----------------------------------------------------------------------------- +// fatfs_fat_init: +//----------------------------------------------------------------------------- +void fatfs_fat_init(struct fatfs *fs) +{ + int i; + + // FAT buffer chain head + fs->fat_buffer_head = NULL; + + for (i=0;ifat_buffers[i].address = FAT32_INVALID_CLUSTER; + fs->fat_buffers[i].dirty = 0; + memset(fs->fat_buffers[i].sector, 0x00, sizeof(fs->fat_buffers[i].sector)); + fs->fat_buffers[i].ptr = NULL; + + // Add to head of queue + fs->fat_buffers[i].next = fs->fat_buffer_head; + fs->fat_buffer_head = &fs->fat_buffers[i]; + } +} +//----------------------------------------------------------------------------- +// fatfs_fat_writeback: Writeback 'dirty' FAT sectors to disk +//----------------------------------------------------------------------------- +static int fatfs_fat_writeback(struct fatfs *fs, struct fat_buffer *pcur) +{ + if (pcur) + { + // Writeback sector if changed + if (pcur->dirty) + { + if (fs->disk_io.write_media) + { + uint32 sectors = FAT_BUFFER_SECTORS; + uint32 offset = pcur->address - fs->fat_begin_lba; + + // Limit to sectors used for the FAT + if ((offset + FAT_BUFFER_SECTORS) <= fs->fat_sectors) + sectors = FAT_BUFFER_SECTORS; + else + sectors = fs->fat_sectors - offset; + + if (!fs->disk_io.write_media(pcur->address, pcur->sector, sectors)) + return 0; + } + + pcur->dirty = 0; + } + + return 1; + } + else + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_fat_read_sector: Read a FAT sector +//----------------------------------------------------------------------------- +static struct fat_buffer *fatfs_fat_read_sector(struct fatfs *fs, uint32 sector) +{ + struct fat_buffer *last = NULL; + struct fat_buffer *pcur = fs->fat_buffer_head; + + // Itterate through sector buffer list + while (pcur) + { + // Sector within this buffer? + if ((sector >= pcur->address) && (sector < (pcur->address + FAT_BUFFER_SECTORS))) + break; + + // End of list? + if (pcur->next == NULL) + { + // Remove buffer from list + if (last) + last->next = NULL; + // We the first and last buffer in the chain? + else + fs->fat_buffer_head = NULL; + } + + last = pcur; + pcur = pcur->next; + } + + // We found the sector already in FAT buffer chain + if (pcur) + { + pcur->ptr = (uint8 *)(pcur->sector + ((sector - pcur->address) * FAT_SECTOR_SIZE)); + return pcur; + } + + // Else, we removed the last item from the list + pcur = last; + + // Add to start of sector buffer list (now newest sector) + pcur->next = fs->fat_buffer_head; + fs->fat_buffer_head = pcur; + + // Writeback sector if changed + if (pcur->dirty) + if (!fatfs_fat_writeback(fs, pcur)) + return 0; + + // Address is now new sector + pcur->address = sector; + + // Read next sector + if (!fs->disk_io.read_media(pcur->address, pcur->sector, FAT_BUFFER_SECTORS)) + { + // Read failed, invalidate buffer address + pcur->address = FAT32_INVALID_CLUSTER; + return NULL; + } + + pcur->ptr = pcur->sector; + return pcur; +} +//----------------------------------------------------------------------------- +// fatfs_fat_purge: Purge 'dirty' FAT sectors to disk +//----------------------------------------------------------------------------- +int fatfs_fat_purge(struct fatfs *fs) +{ + struct fat_buffer *pcur = fs->fat_buffer_head; + + // Itterate through sector buffer list + while (pcur) + { + // Writeback sector if changed + if (pcur->dirty) + if (!fatfs_fat_writeback(fs, pcur)) + return 0; + + pcur = pcur->next; + } + + return 1; +} + +//----------------------------------------------------------------------------- +// General FAT Table Operations +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// fatfs_find_next_cluster: Return cluster number of next cluster in chain by +// reading FAT table and traversing it. Return 0xffffffff for end of chain. +//----------------------------------------------------------------------------- +uint32 fatfs_find_next_cluster(struct fatfs *fs, uint32 current_cluster) +{ + uint32 fat_sector_offset, position; + uint32 nextcluster; + struct fat_buffer *pbuf; + + // Why is '..' labelled with cluster 0 when it should be 2 ?? + if (current_cluster == 0) + current_cluster = 2; + + // Find which sector of FAT table to read + if (fs->fat_type == FAT_TYPE_16) + fat_sector_offset = current_cluster / 256; + else + fat_sector_offset = current_cluster / 128; + + // Read FAT sector into buffer + pbuf = fatfs_fat_read_sector(fs, fs->fat_begin_lba+fat_sector_offset); + if (!pbuf) + return (FAT32_LAST_CLUSTER); + + if (fs->fat_type == FAT_TYPE_16) + { + // Find 32 bit entry of current sector relating to cluster number + position = (current_cluster - (fat_sector_offset * 256)) * 2; + + // Read Next Clusters value from Sector Buffer + nextcluster = FAT16_GET_16BIT_WORD(pbuf, (uint16)position); + + // If end of chain found + if (nextcluster >= 0xFFF8 && nextcluster <= 0xFFFF) + return (FAT32_LAST_CLUSTER); + } + else + { + // Find 32 bit entry of current sector relating to cluster number + position = (current_cluster - (fat_sector_offset * 128)) * 4; + + // Read Next Clusters value from Sector Buffer + nextcluster = FAT32_GET_32BIT_WORD(pbuf, (uint16)position); + + // Mask out MS 4 bits (its 28bit addressing) + nextcluster = nextcluster & 0x0FFFFFFF; + + // If end of chain found + if (nextcluster >= 0x0FFFFFF8 && nextcluster <= 0x0FFFFFFF) + return (FAT32_LAST_CLUSTER); + } + + // Else return next cluster + return (nextcluster); +} +//----------------------------------------------------------------------------- +// fatfs_set_fs_info_next_free_cluster: Write the next free cluster to the FSINFO table +//----------------------------------------------------------------------------- +void fatfs_set_fs_info_next_free_cluster(struct fatfs *fs, uint32 newValue) +{ + if (fs->fat_type == FAT_TYPE_16) + ; + else + { + // Load sector to change it + struct fat_buffer *pbuf = fatfs_fat_read_sector(fs, fs->lba_begin+fs->fs_info_sector); + if (!pbuf) + return ; + + // Change + FAT32_SET_32BIT_WORD(pbuf, 492, newValue); + fs->next_free_cluster = newValue; + + // Write back FSINFO sector to disk + if (fs->disk_io.write_media) + fs->disk_io.write_media(pbuf->address, pbuf->sector, 1); + + // Invalidate cache entry + pbuf->address = FAT32_INVALID_CLUSTER; + pbuf->dirty = 0; + } +} +//----------------------------------------------------------------------------- +// fatfs_find_blank_cluster: Find a free cluster entry by reading the FAT +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fatfs_find_blank_cluster(struct fatfs *fs, uint32 start_cluster, uint32 *free_cluster) +{ + uint32 fat_sector_offset, position; + uint32 nextcluster; + uint32 current_cluster = start_cluster; + struct fat_buffer *pbuf; + + do + { + // Find which sector of FAT table to read + if (fs->fat_type == FAT_TYPE_16) + fat_sector_offset = current_cluster / 256; + else + fat_sector_offset = current_cluster / 128; + + if ( fat_sector_offset < fs->fat_sectors) + { + // Read FAT sector into buffer + pbuf = fatfs_fat_read_sector(fs, fs->fat_begin_lba+fat_sector_offset); + if (!pbuf) + return 0; + + if (fs->fat_type == FAT_TYPE_16) + { + // Find 32 bit entry of current sector relating to cluster number + position = (current_cluster - (fat_sector_offset * 256)) * 2; + + // Read Next Clusters value from Sector Buffer + nextcluster = FAT16_GET_16BIT_WORD(pbuf, (uint16)position); + } + else + { + // Find 32 bit entry of current sector relating to cluster number + position = (current_cluster - (fat_sector_offset * 128)) * 4; + + // Read Next Clusters value from Sector Buffer + nextcluster = FAT32_GET_32BIT_WORD(pbuf, (uint16)position); + + // Mask out MS 4 bits (its 28bit addressing) + nextcluster = nextcluster & 0x0FFFFFFF; + } + + if (nextcluster !=0 ) + current_cluster++; + } + else + // Otherwise, run out of FAT sectors to check... + return 0; + } + while (nextcluster != 0x0); + + // Found blank entry + *free_cluster = current_cluster; + return 1; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_fat_set_cluster: Set a cluster link in the chain. NOTE: Immediate +// write (slow). +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fatfs_fat_set_cluster(struct fatfs *fs, uint32 cluster, uint32 next_cluster) +{ + struct fat_buffer *pbuf; + uint32 fat_sector_offset, position; + + // Find which sector of FAT table to read + if (fs->fat_type == FAT_TYPE_16) + fat_sector_offset = cluster / 256; + else + fat_sector_offset = cluster / 128; + + // Read FAT sector into buffer + pbuf = fatfs_fat_read_sector(fs, fs->fat_begin_lba+fat_sector_offset); + if (!pbuf) + return 0; + + if (fs->fat_type == FAT_TYPE_16) + { + // Find 16 bit entry of current sector relating to cluster number + position = (cluster - (fat_sector_offset * 256)) * 2; + + // Write Next Clusters value to Sector Buffer + FAT16_SET_16BIT_WORD(pbuf, (uint16)position, ((uint16)next_cluster)); + } + else + { + // Find 32 bit entry of current sector relating to cluster number + position = (cluster - (fat_sector_offset * 128)) * 4; + + // Write Next Clusters value to Sector Buffer + FAT32_SET_32BIT_WORD(pbuf, (uint16)position, next_cluster); + } + + return 1; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_free_cluster_chain: Follow a chain marking each element as free +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fatfs_free_cluster_chain(struct fatfs *fs, uint32 start_cluster) +{ + uint32 last_cluster; + uint32 next_cluster = start_cluster; + + // Loop until end of chain + while ( (next_cluster != FAT32_LAST_CLUSTER) && (next_cluster != 0x00000000) ) + { + last_cluster = next_cluster; + + // Find next link + next_cluster = fatfs_find_next_cluster(fs, next_cluster); + + // Clear last link + fatfs_fat_set_cluster(fs, last_cluster, 0x00000000); + } + + return 1; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_fat_add_cluster_to_chain: Follow a chain marking and then add a new entry +// to the current tail. +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fatfs_fat_add_cluster_to_chain(struct fatfs *fs, uint32 start_cluster, uint32 newEntry) +{ + uint32 last_cluster = FAT32_LAST_CLUSTER; + uint32 next_cluster = start_cluster; + + if (start_cluster == FAT32_LAST_CLUSTER) + return 0; + + // Loop until end of chain + while ( next_cluster != FAT32_LAST_CLUSTER ) + { + last_cluster = next_cluster; + + // Find next link + next_cluster = fatfs_find_next_cluster(fs, next_cluster); + if (!next_cluster) + return 0; + } + + // Add link in for new cluster + fatfs_fat_set_cluster(fs, last_cluster, newEntry); + + // Mark new cluster as end of chain + fatfs_fat_set_cluster(fs, newEntry, FAT32_LAST_CLUSTER); + + return 1; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_count_free_clusters: +//----------------------------------------------------------------------------- +uint32 fatfs_count_free_clusters(struct fatfs *fs) +{ + uint32 i,j; + uint32 count = 0; + struct fat_buffer *pbuf; + + for (i = 0; i < fs->fat_sectors; i++) + { + // Read FAT sector into buffer + pbuf = fatfs_fat_read_sector(fs, fs->fat_begin_lba + i); + if (!pbuf) + break; + + for (j = 0; j < FAT_SECTOR_SIZE; ) + { + if (fs->fat_type == FAT_TYPE_16) + { + if (FAT16_GET_16BIT_WORD(pbuf, (uint16)j) == 0) + count++; + + j += 2; + } + else + { + if (FAT32_GET_32BIT_WORD(pbuf, (uint16)j) == 0) + count++; + + j += 4; + } + } + } + + return count; +} diff --git a/src/gui/Lib/fat_io_lib/fat_table.h b/src/gui/Lib/fat_io_lib/fat_table.h new file mode 100644 index 0000000..ead75f3 --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_table.h @@ -0,0 +1,20 @@ +#ifndef __FAT_TABLE_H__ +#define __FAT_TABLE_H__ + +#include "fat_opts.h" +#include "fat_misc.h" + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- +void fatfs_fat_init(struct fatfs *fs); +int fatfs_fat_purge(struct fatfs *fs); +uint32 fatfs_find_next_cluster(struct fatfs *fs, uint32 current_cluster); +void fatfs_set_fs_info_next_free_cluster(struct fatfs *fs, uint32 newValue); +int fatfs_find_blank_cluster(struct fatfs *fs, uint32 start_cluster, uint32 *free_cluster); +int fatfs_fat_set_cluster(struct fatfs *fs, uint32 cluster, uint32 next_cluster); +int fatfs_fat_add_cluster_to_chain(struct fatfs *fs, uint32 start_cluster, uint32 newEntry); +int fatfs_free_cluster_chain(struct fatfs *fs, uint32 start_cluster); +uint32 fatfs_count_free_clusters(struct fatfs *fs); + +#endif diff --git a/src/gui/Lib/fat_io_lib/fat_types.h b/src/gui/Lib/fat_io_lib/fat_types.h new file mode 100644 index 0000000..5e2cca8 --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_types.h @@ -0,0 +1,69 @@ +#ifndef __FAT_TYPES_H__ +#define __FAT_TYPES_H__ + +// Detect 64-bit compilation on GCC +#if defined(__GNUC__) && defined(__SIZEOF_LONG__) + #if __SIZEOF_LONG__ == 8 + #define FATFS_DEF_UINT32_AS_INT + #endif +#endif + +//------------------------------------------------------------- +// System specific types +//------------------------------------------------------------- +#ifndef FATFS_NO_DEF_TYPES + typedef unsigned char uint8; + typedef unsigned short uint16; + + // If compiling on a 64-bit machine, use int as 32-bits + #ifdef FATFS_DEF_UINT32_AS_INT + typedef unsigned int uint32; + // Else for 32-bit machines & embedded systems, use long... + #else + typedef unsigned long uint32; + #endif +#endif + +#ifndef NULL + #define NULL 0 +#endif + +//------------------------------------------------------------- +// Endian Macros +//------------------------------------------------------------- +// FAT is little endian so big endian systems need to swap words + +// Little Endian - No swap required +#if FATFS_IS_LITTLE_ENDIAN == 1 + + #define FAT_HTONS(n) (n) + #define FAT_HTONL(n) (n) + +// Big Endian - Swap required +#else + + #define FAT_HTONS(n) ((((uint16)((n) & 0xff)) << 8) | (((n) & 0xff00) >> 8)) + #define FAT_HTONL(n) (((((uint32)(n) & 0xFF)) << 24) | \ + ((((uint32)(n) & 0xFF00)) << 8) | \ + ((((uint32)(n) & 0xFF0000)) >> 8) | \ + ((((uint32)(n) & 0xFF000000)) >> 24)) + +#endif + +//------------------------------------------------------------- +// Structure Packing Compile Options +//------------------------------------------------------------- +#ifdef __GNUC__ + #define STRUCT_PACK + #define STRUCT_PACK_BEGIN + #define STRUCT_PACK_END + #define STRUCT_PACKED __attribute__ ((packed)) +#else + // Other compilers may require other methods of packing structures + #define STRUCT_PACK + #define STRUCT_PACK_BEGIN + #define STRUCT_PACK_END + #define STRUCT_PACKED +#endif + +#endif diff --git a/src/gui/Lib/fat_io_lib/fat_write.c b/src/gui/Lib/fat_io_lib/fat_write.c new file mode 100644 index 0000000..0718cb1 --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_write.c @@ -0,0 +1,373 @@ +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// FAT16/32 File IO Library +// V2.6 +// Ultra-Embedded.com +// Copyright 2003 - 2012 +// +// Email: admin@ultra-embedded.com +// +// License: GPL +// If you would like a version with a more permissive license for use in +// closed source commercial applications please contact me for details. +//----------------------------------------------------------------------------- +// +// This file is part of FAT File IO Library. +// +// FAT File IO Library is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// FAT File IO Library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with FAT File IO Library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#include +#include "fat_defs.h" +#include "fat_access.h" +#include "fat_table.h" +#include "fat_write.h" +#include "fat_string.h" +#include "fat_misc.h" + +#if FATFS_INC_WRITE_SUPPORT +//----------------------------------------------------------------------------- +// fatfs_add_free_space: Allocate another cluster of free space to the end +// of a files cluster chain. +//----------------------------------------------------------------------------- +int fatfs_add_free_space(struct fatfs *fs, uint32 *startCluster, uint32 clusters) +{ + uint32 i; + uint32 nextcluster; + uint32 start = *startCluster; + + // Set the next free cluster hint to unknown + if (fs->next_free_cluster != FAT32_LAST_CLUSTER) + fatfs_set_fs_info_next_free_cluster(fs, FAT32_LAST_CLUSTER); + + for (i=0;irootdir_first_cluster, &nextcluster)) + { + // Point last to this + fatfs_fat_set_cluster(fs, start, nextcluster); + + // Point this to end of file + fatfs_fat_set_cluster(fs, nextcluster, FAT32_LAST_CLUSTER); + + // Adjust argument reference + start = nextcluster; + if (i == 0) + *startCluster = nextcluster; + } + else + return 0; + } + + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_allocate_free_space: Add an ammount of free space to a file either from +// 'startCluster' if newFile = false, or allocating a new start to the chain if +// newFile = true. +//----------------------------------------------------------------------------- +int fatfs_allocate_free_space(struct fatfs *fs, int newFile, uint32 *startCluster, uint32 size) +{ + uint32 clusterSize; + uint32 clusterCount; + uint32 nextcluster; + + if (size==0) + return 0; + + // Set the next free cluster hint to unknown + if (fs->next_free_cluster != FAT32_LAST_CLUSTER) + fatfs_set_fs_info_next_free_cluster(fs, FAT32_LAST_CLUSTER); + + // Work out size and clusters + clusterSize = fs->sectors_per_cluster * FAT_SECTOR_SIZE; + clusterCount = (size / clusterSize); + + // If any left over + if (size-(clusterSize*clusterCount)) + clusterCount++; + + // Allocated first link in the chain if a new file + if (newFile) + { + if (!fatfs_find_blank_cluster(fs, fs->rootdir_first_cluster, &nextcluster)) + return 0; + + // If this is all that is needed then all done + if (clusterCount==1) + { + fatfs_fat_set_cluster(fs, nextcluster, FAT32_LAST_CLUSTER); + *startCluster = nextcluster; + return 1; + } + } + // Allocate from end of current chain (startCluster is end of chain) + else + nextcluster = *startCluster; + + if (!fatfs_add_free_space(fs, &nextcluster, clusterCount)) + return 0; + + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_find_free_dir_offset: Find a free space in the directory for a new entry +// which takes up 'entryCount' blocks (or allocate some more) +//----------------------------------------------------------------------------- +static int fatfs_find_free_dir_offset(struct fatfs *fs, uint32 dirCluster, int entryCount, uint32 *pSector, uint8 *pOffset) +{ + struct fat_dir_entry *directoryEntry; + uint8 item=0; + uint16 recordoffset = 0; + uint8 i=0; + int x=0; + int possible_spaces = 0; + int start_recorded = 0; + + // No entries required? + if (entryCount == 0) + return 0; + + // Main cluster following loop + while (1) + { + // Read sector + if (fatfs_sector_reader(fs, dirCluster, x++, 0)) + { + // Analyse Sector + for (item = 0; item < FAT_DIR_ENTRIES_PER_SECTOR; item++) + { + // Create the multiplier for sector access + recordoffset = FAT_DIR_ENTRY_SIZE * item; + + // Overlay directory entry over buffer + directoryEntry = (struct fat_dir_entry*)(fs->currentsector.sector+recordoffset); + + // LFN Entry + if (fatfs_entry_lfn_text(directoryEntry)) + { + // First entry? + if (possible_spaces == 0) + { + // Store start + *pSector = x-1; + *pOffset = item; + start_recorded = 1; + } + + // Increment the count in-case the file turns + // out to be deleted... + possible_spaces++; + } + // SFN Entry + else + { + // Has file been deleted? + if (fs->currentsector.sector[recordoffset] == FILE_HEADER_DELETED) + { + // First entry? + if (possible_spaces == 0) + { + // Store start + *pSector = x-1; + *pOffset = item; + start_recorded = 1; + } + + possible_spaces++; + + // We have found enough space? + if (possible_spaces >= entryCount) + return 1; + + // Else continue counting until we find a valid entry! + } + // Is the file entry empty? + else if (fs->currentsector.sector[recordoffset] == FILE_HEADER_BLANK) + { + // First entry? + if (possible_spaces == 0) + { + // Store start + *pSector = x-1; + *pOffset = item; + start_recorded = 1; + } + + // Increment the blank entries count + possible_spaces++; + + // We have found enough space? + if (possible_spaces >= entryCount) + return 1; + } + // File entry is valid + else + { + // Reset all flags + possible_spaces = 0; + start_recorded = 0; + } + } + } // End of for + } // End of if + // Run out of free space in the directory, allocate some more + else + { + uint32 newCluster; + + // Get a new cluster for directory + if (!fatfs_find_blank_cluster(fs, fs->rootdir_first_cluster, &newCluster)) + return 0; + + // Add cluster to end of directory tree + if (!fatfs_fat_add_cluster_to_chain(fs, dirCluster, newCluster)) + return 0; + + // Erase new directory cluster + memset(fs->currentsector.sector, 0x00, FAT_SECTOR_SIZE); + for (i=0;isectors_per_cluster;i++) + { + if (!fatfs_write_sector(fs, newCluster, i, 0)) + return 0; + } + + // If non of the name fitted on previous sectors + if (!start_recorded) + { + // Store start + *pSector = (x-1); + *pOffset = 0; + start_recorded = 1; + } + + return 1; + } + } // End of while loop + + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_add_file_entry: Add a directory entry to a location found by FindFreeOffset +//----------------------------------------------------------------------------- +int fatfs_add_file_entry(struct fatfs *fs, uint32 dirCluster, char *filename, char *shortfilename, uint32 startCluster, uint32 size, int dir) +{ + uint8 item=0; + uint16 recordoffset = 0; + uint8 i=0; + uint32 x=0; + int entryCount; + struct fat_dir_entry shortEntry; + int dirtySector = 0; + + uint32 dirSector = 0; + uint8 dirOffset = 0; + int foundEnd = 0; + + uint8 checksum; + uint8 *pSname; + + // No write access? + if (!fs->disk_io.write_media) + return 0; + +#if FATFS_INC_LFN_SUPPORT + // How many LFN entries are required? + // NOTE: We always request one LFN even if it would fit in a SFN! + entryCount = fatfs_lfn_entries_required(filename); + if (!entryCount) + return 0; +#else + entryCount = 0; +#endif + + // Find space in the directory for this filename (or allocate some more) + // NOTE: We need to find space for at least the LFN + SFN (or just the SFN if LFNs not supported). + if (!fatfs_find_free_dir_offset(fs, dirCluster, entryCount + 1, &dirSector, &dirOffset)) + return 0; + + // Generate checksum of short filename + pSname = (uint8*)shortfilename; + checksum = 0; + for (i=11; i!=0; i--) checksum = ((checksum & 1) ? 0x80 : 0) + (checksum >> 1) + *pSname++; + + // Start from current sector where space was found! + x = dirSector; + + // Main cluster following loop + while (1) + { + // Read sector + if (fatfs_sector_reader(fs, dirCluster, x++, 0)) + { + // Analyse Sector + for (item = 0; item < FAT_DIR_ENTRIES_PER_SECTOR; item++) + { + // Create the multiplier for sector access + recordoffset = FAT_DIR_ENTRY_SIZE * item; + + // If the start position for the entry has been found + if (foundEnd==0) + if ( (dirSector==(x-1)) && (dirOffset==item) ) + foundEnd = 1; + + // Start adding filename + if (foundEnd) + { + if (entryCount==0) + { + // Short filename + fatfs_sfn_create_entry(shortfilename, size, startCluster, &shortEntry, dir); + +#if FATFS_INC_TIME_DATE_SUPPORT + // Update create, access & modify time & date + fatfs_update_timestamps(&shortEntry, 1, 1, 1); +#endif + + memcpy(&fs->currentsector.sector[recordoffset], &shortEntry, sizeof(shortEntry)); + + // Writeback + return fs->disk_io.write_media(fs->currentsector.address, fs->currentsector.sector, 1); + } +#if FATFS_INC_LFN_SUPPORT + else + { + entryCount--; + + // Copy entry to directory buffer + fatfs_filename_to_lfn(filename, &fs->currentsector.sector[recordoffset], entryCount, checksum); + dirtySector = 1; + } +#endif + } + } // End of if + + // Write back to disk before loading another sector + if (dirtySector) + { + if (!fs->disk_io.write_media(fs->currentsector.address, fs->currentsector.sector, 1)) + return 0; + + dirtySector = 0; + } + } + else + return 0; + } // End of while loop + + return 0; +} +#endif diff --git a/src/gui/Lib/fat_io_lib/fat_write.h b/src/gui/Lib/fat_io_lib/fat_write.h new file mode 100644 index 0000000..5558a86 --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_write.h @@ -0,0 +1,14 @@ +#ifndef __FAT_WRITE_H__ +#define __FAT_WRITE_H__ + +#include "fat_defs.h" +#include "fat_opts.h" + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- +int fatfs_add_file_entry(struct fatfs *fs, uint32 dirCluster, char *filename, char *shortfilename, uint32 startCluster, uint32 size, int dir); +int fatfs_add_free_space(struct fatfs *fs, uint32 *startCluster, uint32 clusters); +int fatfs_allocate_free_space(struct fatfs *fs, int newFile, uint32 *startCluster, uint32 size); + +#endif diff --git a/src/gui/Lib/fat_io_lib/version.txt b/src/gui/Lib/fat_io_lib/version.txt new file mode 100644 index 0000000..5a00a98 --- /dev/null +++ b/src/gui/Lib/fat_io_lib/version.txt @@ -0,0 +1 @@ +2.6.11 diff --git a/src/gui/Lib/libhttp/buildlib.sh b/src/gui/Lib/libhttp/buildlib.sh new file mode 100644 index 0000000..07c542f --- /dev/null +++ b/src/gui/Lib/libhttp/buildlib.sh @@ -0,0 +1,46 @@ +#!/bin/sh + +# https://github.com/lammertb/libhttp/archive/v1.8.tar.gz + + +# rm -rf include +# rm -rf lib +# mkdir include +# mkdir lib + +# rm -rf libhttp-1.8 +# tar xf libhttp-1.8.tar.gz +# cd libhttp-1.8 +# cp -a include/civetweb.h ../include/ + + +# cd .. +# rm -rf libhttp-1.8 +# tar xf libhttp-1.8.tar.gz +# cd libhttp-1.8 +# make lib COPT="-DNDEBUG -DNO_CGI -DNO_CACHING -DNO_SSL -DSQLITE_DISABLE_LFS -DSSL_ALREADY_INITIALIZED" +# cp -a libcivetweb.a ../lib/libcivetweb_64.a + + + +# cd .. +# rm -rf libhttp-1.8 +# tar xf libhttp-1.8.tar.gz +# cd libhttp-1.8 +# make lib COPT="-m32 -DNDEBUG -DNO_CGI -DNO_CACHING -DNO_SSL -DSQLITE_DISABLE_LFS -DSSL_ALREADY_INITIALIZED" +# cp -a libcivetweb.a ../lib/libcivetweb_32.a + + + +# cd .. +# rm -rf libhttp-1.8 +# tar xf libhttp-1.8.tar.gz +# cd libhttp-1.8 +# make lib CC=aarch64-linux-gnu-gcc COPT="-DNDEBUG -DNO_CGI -DNO_CACHING -DNO_SSL -DSQLITE_DISABLE_LFS -DSSL_ALREADY_INITIALIZED" +# cp -a libcivetweb.a ../lib/libcivetweb_aa64.a + + +# cd .. +# rm -rf libhttp-1.8 + + diff --git a/src/gui/Lib/libhttp/include/civetweb.c b/src/gui/Lib/libhttp/include/civetweb.c new file mode 100644 index 0000000..98130f5 --- /dev/null +++ b/src/gui/Lib/libhttp/include/civetweb.c @@ -0,0 +1,13145 @@ +/* Copyright (c) 2013-2016 the Civetweb developers + * Copyright (c) 2004-2013 Sergey Lyubka + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#if defined(_WIN32) +#if !defined(_CRT_SECURE_NO_WARNINGS) +#define _CRT_SECURE_NO_WARNINGS /* Disable deprecation warning in VS2005 */ +#endif +#ifndef _WIN32_WINNT /* defined for tdm-gcc so we can use getnameinfo */ +#define _WIN32_WINNT 0x0501 +#endif +#else +#if defined(__GNUC__) && !defined(_GNU_SOURCE) +#define _GNU_SOURCE /* for setgroups() */ +#endif +#if defined(__linux__) && !defined(_XOPEN_SOURCE) +#define _XOPEN_SOURCE 600 /* For flockfile() on Linux */ +#endif +#ifndef _LARGEFILE_SOURCE +#define _LARGEFILE_SOURCE /* For fseeko(), ftello() */ +#endif +#ifndef _FILE_OFFSET_BITS +#define _FILE_OFFSET_BITS 64 /* Use 64-bit file offsets by default */ +#endif +#ifndef __STDC_FORMAT_MACROS +#define __STDC_FORMAT_MACROS /* wants this for C++ */ +#endif +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS /* C++ wants that for INT64_MAX */ +#endif +#ifdef __sun +#define __EXTENSIONS__ /* to expose flockfile and friends in stdio.h */ +#define __inline inline /* not recognized on older compiler versions */ +#endif +#endif + +#if defined(USE_LUA) && defined(USE_WEBSOCKET) +#define USE_TIMERS +#endif + +#if defined(_MSC_VER) +/* 'type cast' : conversion from 'int' to 'HANDLE' of greater size */ +#pragma warning(disable : 4306) +/* conditional expression is constant: introduced by FD_SET(..) */ +#pragma warning(disable : 4127) +/* non-constant aggregate initializer: issued due to missing C99 support */ +#pragma warning(disable : 4204) +/* padding added after data member */ +#pragma warning(disable : 4820) +/* not defined as a preprocessor macro, replacing with '0' for '#if/#elif' */ +#pragma warning(disable : 4668) +/* no function prototype given: converting '()' to '(void)' */ +#pragma warning(disable : 4255) +/* function has been selected for automatic inline expansion */ +#pragma warning(disable : 4711) +#endif + + +/* This code uses static_assert to check some conditions. + * Unfortunately some compilers still do not support it, so we have a + * replacement function here. */ +#if defined(_MSC_VER) && (_MSC_VER >= 1600) +#define mg_static_assert static_assert +#elif defined(__cplusplus) && (__cplusplus >= 201103L) +#define mg_static_assert static_assert +#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) +#define mg_static_assert _Static_assert +#else +char static_assert_replacement[1]; +#define mg_static_assert(cond, txt) \ + extern char static_assert_replacement[(cond) ? 1 : -1] +#endif + +mg_static_assert(sizeof(int) == 4 || sizeof(int) == 8, + "int data type size check"); +mg_static_assert(sizeof(void *) == 4 || sizeof(void *) == 8, + "pointer data type size check"); +mg_static_assert(sizeof(void *) >= sizeof(int), "data type size check"); +/* mg_static_assert(sizeof(size_t) == 4 || sizeof(size_t) == 8, "size_t data + * type size check"); */ + +/* DTL -- including winsock2.h works better if lean and mean */ +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif + +#if defined(__SYMBIAN32__) +#define NO_SSL /* SSL is not supported */ +#define NO_CGI /* CGI is not supported */ +#define PATH_MAX FILENAME_MAX +#endif /* __SYMBIAN32__ */ + + +/* Include the header file here, so the CivetWeb interface is defined for the + * entire implementation, including the following forward definitions. */ +#include "civetweb.h" + + +#ifndef IGNORE_UNUSED_RESULT +#define IGNORE_UNUSED_RESULT(a) ((void)((a) && 1)) +#endif + +#ifndef _WIN32_WCE /* Some ANSI #includes are not available on Windows CE */ +#include +#include +#include +#include +#include +#endif /* !_WIN32_WCE */ + +#ifdef __MACH__ + +#define CLOCK_MONOTONIC (1) +#define CLOCK_REALTIME (2) + +#include +#include +#include +#include +#include + + +/* clock_gettime is not implemented on OSX */ +int clock_gettime(int clk_id, struct timespec *t); + +int +clock_gettime(int clk_id, struct timespec *t) +{ + memset(t, 0, sizeof(*t)); + if (clk_id == CLOCK_REALTIME) { + struct timeval now; + int rv = gettimeofday(&now, NULL); + if (rv) { + return rv; + } + t->tv_sec = now.tv_sec; + t->tv_nsec = now.tv_usec * 1000; + return 0; + + } else if (clk_id == CLOCK_MONOTONIC) { + static uint64_t clock_start_time = 0; + static mach_timebase_info_data_t timebase_ifo = {0, 0}; + + uint64_t now = mach_absolute_time(); + + if (clock_start_time == 0) { + kern_return_t mach_status = mach_timebase_info(&timebase_ifo); +#if defined(DEBUG) + assert(mach_status == KERN_SUCCESS); +#else + /* appease "unused variable" warning for release builds */ + (void)mach_status; +#endif + clock_start_time = now; + } + + now = (uint64_t)((double)(now - clock_start_time) + * (double)timebase_ifo.numer + / (double)timebase_ifo.denom); + + t->tv_sec = now / 1000000000; + t->tv_nsec = now % 1000000000; + return 0; + } + return -1; /* EINVAL - Clock ID is unknown */ +} +#endif + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#ifndef MAX_WORKER_THREADS +#define MAX_WORKER_THREADS (1024 * 64) +#endif +#ifndef SOCKET_TIMEOUT_QUANTUM +#define SOCKET_TIMEOUT_QUANTUM (10000) +#endif + +mg_static_assert(MAX_WORKER_THREADS >= 1, + "worker threads must be a positive number"); + +#if defined(_WIN32) \ + && !defined(__SYMBIAN32__) /* WINDOWS / UNIX include block */ +#include +#include /* DTL add for SO_EXCLUSIVE */ +#include + +typedef const char *SOCK_OPT_TYPE; + +#if !defined(PATH_MAX) +#define PATH_MAX (MAX_PATH) +#endif + +#if !defined(PATH_MAX) +#define PATH_MAX (4096) +#endif + +mg_static_assert(PATH_MAX >= 1, "path length must be a positive number"); + +#ifndef _IN_PORT_T +#ifndef in_port_t +#define in_port_t u_short +#endif +#endif + +#ifndef _WIN32_WCE +#include +#include +#include +#else /* _WIN32_WCE */ +#define NO_CGI /* WinCE has no pipes */ + +typedef long off_t; + +#define errno ((int)(GetLastError())) +#define strerror(x) (_ultoa(x, (char *)_alloca(sizeof(x) * 3), 10)) +#endif /* _WIN32_WCE */ + +#define MAKEUQUAD(lo, hi) \ + ((uint64_t)(((uint32_t)(lo)) | ((uint64_t)((uint32_t)(hi))) << 32)) +#define RATE_DIFF (10000000) /* 100 nsecs */ +#define EPOCH_DIFF (MAKEUQUAD(0xd53e8000, 0x019db1de)) +#define SYS2UNIX_TIME(lo, hi) \ + ((time_t)((MAKEUQUAD((lo), (hi)) - EPOCH_DIFF) / RATE_DIFF)) + +/* Visual Studio 6 does not know __func__ or __FUNCTION__ + * The rest of MS compilers use __FUNCTION__, not C99 __func__ + * Also use _strtoui64 on modern M$ compilers */ +#if defined(_MSC_VER) +#if (_MSC_VER < 1300) +#define STRX(x) #x +#define STR(x) STRX(x) +#define __func__ __FILE__ ":" STR(__LINE__) +#define strtoull(x, y, z) ((unsigned __int64)_atoi64(x)) +#define strtoll(x, y, z) (_atoi64(x)) +#else +#define __func__ __FUNCTION__ +#define strtoull(x, y, z) (_strtoui64(x, y, z)) +#define strtoll(x, y, z) (_strtoi64(x, y, z)) +#endif +#endif /* _MSC_VER */ + +#define ERRNO ((int)(GetLastError())) +#define NO_SOCKLEN_T + +#if defined(_WIN64) || defined(__MINGW64__) +#define SSL_LIB "ssleay64.dll" +#define CRYPTO_LIB "libeay64.dll" +#else +#define SSL_LIB "ssleay32.dll" +#define CRYPTO_LIB "libeay32.dll" +#endif + +#define O_NONBLOCK (0) +#ifndef W_OK +#define W_OK (2) /* http://msdn.microsoft.com/en-us/library/1w06ktdy.aspx */ +#endif +#if !defined(EWOULDBLOCK) +#define EWOULDBLOCK WSAEWOULDBLOCK +#endif /* !EWOULDBLOCK */ +#define _POSIX_ +#define INT64_FMT "I64d" +#define UINT64_FMT "I64u" + +#define WINCDECL __cdecl +#define SHUT_RD (0) +#define SHUT_WR (1) +#define SHUT_BOTH (2) +#define vsnprintf_impl _vsnprintf +#define access _access +#define mg_sleep(x) (Sleep(x)) + +#define pipe(x) _pipe(x, MG_BUF_LEN, _O_BINARY) +#ifndef popen +#define popen(x, y) (_popen(x, y)) +#endif +#ifndef pclose +#define pclose(x) (_pclose(x)) +#endif +#define close(x) (_close(x)) +#define dlsym(x, y) (GetProcAddress((HINSTANCE)(x), (y))) +#define RTLD_LAZY (0) +#define fseeko(x, y, z) (_lseeki64(_fileno(x), (y), (z)) == -1 ? -1 : 0) +#define fdopen(x, y) (_fdopen((x), (y))) +#define write(x, y, z) (_write((x), (y), (unsigned)z)) +#define read(x, y, z) (_read((x), (y), (unsigned)z)) +#define flockfile(x) (EnterCriticalSection(&global_log_file_lock)) +#define funlockfile(x) (LeaveCriticalSection(&global_log_file_lock)) +#define sleep(x) (Sleep((x)*1000)) +#define rmdir(x) (_rmdir(x)) +#define timegm(x) (_mkgmtime(x)) + +#if !defined(fileno) +#define fileno(x) (_fileno(x)) +#endif /* !fileno MINGW #defines fileno */ + +typedef HANDLE pthread_mutex_t; +typedef DWORD pthread_key_t; +typedef HANDLE pthread_t; +typedef struct { + CRITICAL_SECTION threadIdSec; + int waitingthreadcount; /* The number of threads queued. */ + pthread_t *waitingthreadhdls; /* The thread handles. */ +} pthread_cond_t; + +#ifndef __clockid_t_defined +typedef DWORD clockid_t; +#endif +#ifndef CLOCK_MONOTONIC +#define CLOCK_MONOTONIC (1) +#endif +#ifndef CLOCK_REALTIME +#define CLOCK_REALTIME (2) +#endif + +#if defined(_MSC_VER) && (_MSC_VER >= 1900) +#define _TIMESPEC_DEFINED +#endif +#ifndef _TIMESPEC_DEFINED +struct timespec { + time_t tv_sec; /* seconds */ + long tv_nsec; /* nanoseconds */ +}; +#endif + +#define pid_t HANDLE /* MINGW typedefs pid_t to int. Using #define here. */ + +static int pthread_mutex_lock(pthread_mutex_t *); +static int pthread_mutex_unlock(pthread_mutex_t *); +static void path_to_unicode(const struct mg_connection *conn, + const char *path, + wchar_t *wbuf, + size_t wbuf_len); +struct file; +static const char * +mg_fgets(char *buf, size_t size, struct file *filep, char **p); + + +#if defined(HAVE_STDINT) +#include +#else +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef unsigned __int64 uint64_t; +typedef __int64 int64_t; +#define INT64_MAX (9223372036854775807) +#endif /* HAVE_STDINT */ + +/* POSIX dirent interface */ +struct dirent { + char d_name[PATH_MAX]; +}; + +typedef struct DIR { + HANDLE handle; + WIN32_FIND_DATAW info; + struct dirent result; +} DIR; + +#if defined(_WIN32) && !defined(POLLIN) +#ifndef HAVE_POLL +struct pollfd { + SOCKET fd; + short events; + short revents; +}; +#define POLLIN (0x0300) +#endif +#endif + +/* Mark required libraries */ +#if defined(_MSC_VER) +#pragma comment(lib, "Ws2_32.lib") +#endif + +#else /* defined(_WIN32) && !defined(__SYMBIAN32__) - WINDOWS / UNIX include \ + block */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +typedef const void *SOCK_OPT_TYPE; + +#if defined(ANDROID) +typedef unsigned short int in_port_t; +#endif + +#include +#include +#include +#include +#define vsnprintf_impl vsnprintf + +#if !defined(NO_SSL_DL) && !defined(NO_SSL) +#include +#endif +#include +#if defined(__MACH__) +#define SSL_LIB "libssl.dylib" +#define CRYPTO_LIB "libcrypto.dylib" +#else +#if !defined(SSL_LIB) +#define SSL_LIB "libssl.so" +#endif +#if !defined(CRYPTO_LIB) +#define CRYPTO_LIB "libcrypto.so" +#endif +#endif +#ifndef O_BINARY +#define O_BINARY (0) +#endif /* O_BINARY */ +#define closesocket(a) (close(a)) +#define mg_mkdir(conn, path, mode) (mkdir(path, mode)) +#define mg_remove(conn, x) (remove(x)) +#define mg_sleep(x) (usleep((x)*1000)) +#define mg_opendir(conn, x) (opendir(x)) +#define mg_closedir(x) (closedir(x)) +#define mg_readdir(x) (readdir(x)) +#define ERRNO (errno) +#define INVALID_SOCKET (-1) +#define INT64_FMT PRId64 +#define UINT64_FMT PRIu64 +typedef int SOCKET; +#define WINCDECL + +#if defined(__hpux) +/* HPUX 11 does not have monotonic, fall back to realtime */ +#ifndef CLOCK_MONOTONIC +#define CLOCK_MONOTONIC CLOCK_REALTIME +#endif + +/* HPUX defines socklen_t incorrectly as size_t which is 64bit on + * Itanium. Without defining _XOPEN_SOURCE or _XOPEN_SOURCE_EXTENDED + * the prototypes use int* rather than socklen_t* which matches the + * actual library expectation. When called with the wrong size arg + * accept() returns a zero client inet addr and check_acl() always + * fails. Since socklen_t is widely used below, just force replace + * their typedef with int. - DTL + */ +#define socklen_t int +#endif /* hpux */ + +#endif /* defined(_WIN32) && !defined(__SYMBIAN32__) - WINDOWS / UNIX include \ + block */ + +/* va_copy should always be a macro, C99 and C++11 - DTL */ +#ifndef va_copy +#define va_copy(x, y) ((x) = (y)) +#endif + +#ifdef _WIN32 +/* Create substitutes for POSIX functions in Win32. */ + +#if defined(__MINGW32__) +/* Show no warning in case system functions are not used. */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +#endif + + +static CRITICAL_SECTION global_log_file_lock; +static DWORD +pthread_self(void) +{ + return GetCurrentThreadId(); +} + + +static int +pthread_key_create( + pthread_key_t *key, + void (*_ignored)(void *) /* destructor not supported for Windows */ + ) +{ + (void)_ignored; + + if ((key != 0)) { + *key = TlsAlloc(); + return (*key != TLS_OUT_OF_INDEXES) ? 0 : -1; + } + return -2; +} + + +static int +pthread_key_delete(pthread_key_t key) +{ + return TlsFree(key) ? 0 : 1; +} + + +static int +pthread_setspecific(pthread_key_t key, void *value) +{ + return TlsSetValue(key, value) ? 0 : 1; +} + + +static void * +pthread_getspecific(pthread_key_t key) +{ + return TlsGetValue(key); +} + +#if defined(__MINGW32__) +/* Enable unused function warning again */ +#pragma GCC diagnostic pop +#endif + +static struct pthread_mutex_undefined_struct *pthread_mutex_attr = NULL; +#else +static pthread_mutexattr_t pthread_mutex_attr; +#endif /* _WIN32 */ + + +#define PASSWORDS_FILE_NAME ".htpasswd" +#define CGI_ENVIRONMENT_SIZE (4096) +#define MAX_CGI_ENVIR_VARS (256) +#define MG_BUF_LEN (8192) + +#ifndef MAX_REQUEST_SIZE +#define MAX_REQUEST_SIZE (16384) +#endif + +mg_static_assert(MAX_REQUEST_SIZE >= 256, + "request size length must be a positive number"); + +#define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0])) + +#if !defined(DEBUG_TRACE) +#if defined(DEBUG) + + +static void DEBUG_TRACE_FUNC(const char *func, + unsigned line, + PRINTF_FORMAT_STRING(const char *fmt), + ...) PRINTF_ARGS(3, 4); + +static void +DEBUG_TRACE_FUNC(const char *func, unsigned line, const char *fmt, ...) +{ + va_list args; + flockfile(stdout); + printf("*** %lu.%p.%s.%u: ", + (unsigned long)time(NULL), + (void *)pthread_self(), + func, + line); + va_start(args, fmt); + vprintf(fmt, args); + va_end(args); + putchar('\n'); + fflush(stdout); + funlockfile(stdout); +} + +#define DEBUG_TRACE(fmt, ...) \ + DEBUG_TRACE_FUNC(__func__, __LINE__, fmt, __VA_ARGS__) + +#else +#define DEBUG_TRACE(fmt, ...) \ + do { \ + } while (0) +#endif /* DEBUG */ +#endif /* DEBUG_TRACE */ + +#if defined(MEMORY_DEBUGGING) +unsigned long mg_memory_debug_blockCount = 0; +unsigned long mg_memory_debug_totalMemUsed = 0; + + +static void * +mg_malloc_ex(size_t size, const char *file, unsigned line) +{ + void *data = malloc(size + sizeof(size_t)); + void *memory = 0; + char mallocStr[256]; + + if (data) { + *(size_t *)data = size; + mg_memory_debug_totalMemUsed += size; + mg_memory_debug_blockCount++; + memory = (void *)(((char *)data) + sizeof(size_t)); + } + + sprintf(mallocStr, + "MEM: %p %5lu alloc %7lu %4lu --- %s:%u\n", + memory, + (unsigned long)size, + mg_memory_debug_totalMemUsed, + mg_memory_debug_blockCount, + file, + line); +#if defined(_WIN32) + OutputDebugStringA(mallocStr); +#else + DEBUG_TRACE("%s", mallocStr); +#endif + + return memory; +} + + +static void * +mg_calloc_ex(size_t count, size_t size, const char *file, unsigned line) +{ + void *data = mg_malloc_ex(size * count, file, line); + if (data) { + memset(data, 0, size); + } + return data; +} + + +static void +mg_free_ex(void *memory, const char *file, unsigned line) +{ + char mallocStr[256]; + void *data = (void *)(((char *)memory) - sizeof(size_t)); + size_t size; + + if (memory) { + size = *(size_t *)data; + mg_memory_debug_totalMemUsed -= size; + mg_memory_debug_blockCount--; + sprintf(mallocStr, + "MEM: %p %5lu free %7lu %4lu --- %s:%u\n", + memory, + (unsigned long)size, + mg_memory_debug_totalMemUsed, + mg_memory_debug_blockCount, + file, + line); +#if defined(_WIN32) + OutputDebugStringA(mallocStr); +#else + DEBUG_TRACE("%s", mallocStr); +#endif + + free(data); + } +} + + +static void * +mg_realloc_ex(void *memory, size_t newsize, const char *file, unsigned line) +{ + char mallocStr[256]; + void *data; + void *_realloc; + size_t oldsize; + + if (newsize) { + if (memory) { + data = (void *)(((char *)memory) - sizeof(size_t)); + oldsize = *(size_t *)data; + _realloc = realloc(data, newsize + sizeof(size_t)); + if (_realloc) { + data = _realloc; + mg_memory_debug_totalMemUsed -= oldsize; + sprintf(mallocStr, + "MEM: %p %5lu r-free %7lu %4lu --- %s:%u\n", + memory, + (unsigned long)oldsize, + mg_memory_debug_totalMemUsed, + mg_memory_debug_blockCount, + file, + line); +#if defined(_WIN32) + OutputDebugStringA(mallocStr); +#else + DEBUG_TRACE("%s", mallocStr); +#endif + mg_memory_debug_totalMemUsed += newsize; + sprintf(mallocStr, + "MEM: %p %5lu r-alloc %7lu %4lu --- %s:%u\n", + memory, + (unsigned long)newsize, + mg_memory_debug_totalMemUsed, + mg_memory_debug_blockCount, + file, + line); +#if defined(_WIN32) + OutputDebugStringA(mallocStr); +#else + DEBUG_TRACE("%s", mallocStr); +#endif + *(size_t *)data = newsize; + data = (void *)(((char *)data) + sizeof(size_t)); + } else { +#if defined(_WIN32) + OutputDebugStringA("MEM: realloc failed\n"); +#else + DEBUG_TRACE("%s", "MEM: realloc failed\n"); +#endif + return _realloc; + } + } else { + data = mg_malloc_ex(newsize, file, line); + } + } else { + data = 0; + mg_free_ex(memory, file, line); + } + + return data; +} + +#define mg_malloc(a) mg_malloc_ex(a, __FILE__, __LINE__) +#define mg_calloc(a, b) mg_calloc_ex(a, b, __FILE__, __LINE__) +#define mg_realloc(a, b) mg_realloc_ex(a, b, __FILE__, __LINE__) +#define mg_free(a) mg_free_ex(a, __FILE__, __LINE__) + +#else + +static __inline void * +mg_malloc(size_t a) +{ + return malloc(a); +} + +static __inline void * +mg_calloc(size_t a, size_t b) +{ + return calloc(a, b); +} + +static __inline void * +mg_realloc(void *a, size_t b) +{ + return realloc(a, b); +} + +static __inline void +mg_free(void *a) +{ + free(a); +} + +#endif + + +static void mg_vsnprintf(const struct mg_connection *conn, + int *truncated, + char *buf, + size_t buflen, + const char *fmt, + va_list ap); + +static void mg_snprintf(const struct mg_connection *conn, + int *truncated, + char *buf, + size_t buflen, + PRINTF_FORMAT_STRING(const char *fmt), + ...) PRINTF_ARGS(5, 6); + +/* This following lines are just meant as a reminder to use the mg-functions + * for memory management */ +#ifdef malloc +#undef malloc +#endif +#ifdef calloc +#undef calloc +#endif +#ifdef realloc +#undef realloc +#endif +#ifdef free +#undef free +#endif +#ifdef snprintf +#undef snprintf +#endif +#ifdef vsnprintf +#undef vsnprintf +#endif +#define malloc DO_NOT_USE_THIS_FUNCTION__USE_mg_malloc +#define calloc DO_NOT_USE_THIS_FUNCTION__USE_mg_calloc +#define realloc DO_NOT_USE_THIS_FUNCTION__USE_mg_realloc +#define free DO_NOT_USE_THIS_FUNCTION__USE_mg_free +#define snprintf DO_NOT_USE_THIS_FUNCTION__USE_mg_snprintf +#ifdef _WIN32 /* vsnprintf must not be used in any system, * \ + * but this define only works well for Windows. */ +#define vsnprintf DO_NOT_USE_THIS_FUNCTION__USE_mg_vsnprintf +#endif + +#define MD5_STATIC static +#include "md5.inl" + +/* Darwin prior to 7.0 and Win32 do not have socklen_t */ +#ifdef NO_SOCKLEN_T +typedef int socklen_t; +#endif /* NO_SOCKLEN_T */ +#define _DARWIN_UNLIMITED_SELECT + +#define IP_ADDR_STR_LEN (50) /* IPv6 hex string is 46 chars */ + +#if !defined(MSG_NOSIGNAL) +#define MSG_NOSIGNAL (0) +#endif + +#if !defined(SOMAXCONN) +#define SOMAXCONN (100) +#endif + +/* Size of the accepted socket queue */ +#if !defined(MGSQLEN) +#define MGSQLEN (20) +#endif + +#if defined(NO_SSL_DL) +#include +#include +#include +#include +#include +#else +/* SSL loaded dynamically from DLL. + * I put the prototypes here to be independent from OpenSSL source + * installation. */ + +typedef struct ssl_st SSL; +typedef struct ssl_method_st SSL_METHOD; +typedef struct ssl_ctx_st SSL_CTX; +typedef struct x509_store_ctx_st X509_STORE_CTX; + +#define SSL_CTRL_OPTIONS (32) +#define SSL_CTRL_CLEAR_OPTIONS (77) +#define SSL_CTRL_SET_ECDH_AUTO (94) + +#define SSL_VERIFY_NONE (0) +#define SSL_VERIFY_PEER (1) +#define SSL_VERIFY_FAIL_IF_NO_PEER_CERT (2) +#define SSL_VERIFY_CLIENT_ONCE (4) +#define SSL_OP_ALL ((long)(0x80000BFFUL)) +#define SSL_OP_NO_SSLv2 (0x01000000L) +#define SSL_OP_NO_SSLv3 (0x02000000L) +#define SSL_OP_NO_TLSv1 (0x04000000L) +#define SSL_OP_NO_TLSv1_2 (0x08000000L) +#define SSL_OP_NO_TLSv1_1 (0x10000000L) +#define SSL_OP_SINGLE_DH_USE (0x00100000L) + +struct ssl_func { + const char *name; /* SSL function name */ + void (*ptr)(void); /* Function pointer */ +}; + +#define SSL_free (*(void (*)(SSL *))ssl_sw[0].ptr) +#define SSL_accept (*(int (*)(SSL *))ssl_sw[1].ptr) +#define SSL_connect (*(int (*)(SSL *))ssl_sw[2].ptr) +#define SSL_read (*(int (*)(SSL *, void *, int))ssl_sw[3].ptr) +#define SSL_write (*(int (*)(SSL *, const void *, int))ssl_sw[4].ptr) +#define SSL_get_error (*(int (*)(SSL *, int))ssl_sw[5].ptr) +#define SSL_set_fd (*(int (*)(SSL *, SOCKET))ssl_sw[6].ptr) +#define SSL_new (*(SSL * (*)(SSL_CTX *))ssl_sw[7].ptr) +#define SSL_CTX_new (*(SSL_CTX * (*)(SSL_METHOD *))ssl_sw[8].ptr) +#define SSLv23_server_method (*(SSL_METHOD * (*)(void))ssl_sw[9].ptr) +#define SSL_library_init (*(int (*)(void))ssl_sw[10].ptr) +#define SSL_CTX_use_PrivateKey_file \ + (*(int (*)(SSL_CTX *, const char *, int))ssl_sw[11].ptr) +#define SSL_CTX_use_certificate_file \ + (*(int (*)(SSL_CTX *, const char *, int))ssl_sw[12].ptr) +#define SSL_CTX_set_default_passwd_cb \ + (*(void (*)(SSL_CTX *, mg_callback_t))ssl_sw[13].ptr) +#define SSL_CTX_free (*(void (*)(SSL_CTX *))ssl_sw[14].ptr) +#define SSL_load_error_strings (*(void (*)(void))ssl_sw[15].ptr) +#define SSL_CTX_use_certificate_chain_file \ + (*(int (*)(SSL_CTX *, const char *))ssl_sw[16].ptr) +#define SSLv23_client_method (*(SSL_METHOD * (*)(void))ssl_sw[17].ptr) +#define SSL_pending (*(int (*)(SSL *))ssl_sw[18].ptr) +#define SSL_CTX_set_verify \ + (*(void (*)(SSL_CTX *, \ + int, \ + int (*verify_callback)(int, X509_STORE_CTX *)))ssl_sw[19].ptr) +#define SSL_shutdown (*(int (*)(SSL *))ssl_sw[20].ptr) +#define SSL_CTX_load_verify_locations \ + (*(int (*)(SSL_CTX *, const char *, const char *))ssl_sw[21].ptr) +#define SSL_CTX_set_default_verify_paths (*(int (*)(SSL_CTX *))ssl_sw[22].ptr) +#define SSL_CTX_set_verify_depth (*(void (*)(SSL_CTX *, int))ssl_sw[23].ptr) +#define SSL_get_peer_certificate (*(X509 * (*)(SSL *))ssl_sw[24].ptr) +#define SSL_get_version (*(const char *(*)(SSL *))ssl_sw[25].ptr) +#define SSL_get_current_cipher (*(SSL_CIPHER * (*)(SSL *))ssl_sw[26].ptr) +#define SSL_CIPHER_get_name \ + (*(const char *(*)(const SSL_CIPHER *))ssl_sw[27].ptr) +#define SSL_CTX_check_private_key (*(int (*)(SSL_CTX *))ssl_sw[28].ptr) +#define SSL_CTX_set_session_id_context \ + (*(int (*)(SSL_CTX *, const unsigned char *, unsigned int))ssl_sw[29].ptr) +#define SSL_CTX_ctrl (*(long (*)(SSL_CTX *, int, long, void *))ssl_sw[30].ptr) +#define SSL_CTX_set_cipher_list \ + (*(int (*)(SSL_CTX *, const char *))ssl_sw[31].ptr) +#define SSL_CTX_set_options(ctx, op) \ + SSL_CTX_ctrl((ctx), SSL_CTRL_OPTIONS, (op), NULL) +#define SSL_CTX_clear_options(ctx, op) \ + SSL_CTX_ctrl((ctx), SSL_CTRL_CLEAR_OPTIONS, (op), NULL) +#define SSL_CTX_set_ecdh_auto(ctx, onoff) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_ECDH_AUTO, onoff, NULL) + +#define CRYPTO_num_locks (*(int (*)(void))crypto_sw[0].ptr) +#define CRYPTO_set_locking_callback \ + (*(void (*)(void (*)(int, int, const char *, int)))crypto_sw[1].ptr) +#define CRYPTO_set_id_callback \ + (*(void (*)(unsigned long (*)(void)))crypto_sw[2].ptr) +#define ERR_get_error (*(unsigned long (*)(void))crypto_sw[3].ptr) +#define ERR_error_string (*(char *(*)(unsigned long, char *))crypto_sw[4].ptr) +#define ERR_remove_state (*(void (*)(unsigned long))crypto_sw[5].ptr) +#define ERR_free_strings (*(void (*)(void))crypto_sw[6].ptr) +#define ENGINE_cleanup (*(void (*)(void))crypto_sw[7].ptr) +#define CONF_modules_unload (*(void (*)(int))crypto_sw[8].ptr) +#define CRYPTO_cleanup_all_ex_data (*(void (*)(void))crypto_sw[9].ptr) +#define EVP_cleanup (*(void (*)(void))crypto_sw[10].ptr) + + +/* set_ssl_option() function updates this array. + * It loads SSL library dynamically and changes NULLs to the actual addresses + * of respective functions. The macros above (like SSL_connect()) are really + * just calling these functions indirectly via the pointer. */ +static struct ssl_func ssl_sw[] = {{"SSL_free", NULL}, + {"SSL_accept", NULL}, + {"SSL_connect", NULL}, + {"SSL_read", NULL}, + {"SSL_write", NULL}, + {"SSL_get_error", NULL}, + {"SSL_set_fd", NULL}, + {"SSL_new", NULL}, + {"SSL_CTX_new", NULL}, + {"SSLv23_server_method", NULL}, + {"SSL_library_init", NULL}, + {"SSL_CTX_use_PrivateKey_file", NULL}, + {"SSL_CTX_use_certificate_file", NULL}, + {"SSL_CTX_set_default_passwd_cb", NULL}, + {"SSL_CTX_free", NULL}, + {"SSL_load_error_strings", NULL}, + {"SSL_CTX_use_certificate_chain_file", NULL}, + {"SSLv23_client_method", NULL}, + {"SSL_pending", NULL}, + {"SSL_CTX_set_verify", NULL}, + {"SSL_shutdown", NULL}, + {"SSL_CTX_load_verify_locations", NULL}, + {"SSL_CTX_set_default_verify_paths", NULL}, + {"SSL_CTX_set_verify_depth", NULL}, + {"SSL_get_peer_certificate", NULL}, + {"SSL_get_version", NULL}, + {"SSL_get_current_cipher", NULL}, + {"SSL_CIPHER_get_name", NULL}, + {"SSL_CTX_check_private_key", NULL}, + {"SSL_CTX_set_session_id_context", NULL}, + {"SSL_CTX_ctrl", NULL}, + {"SSL_CTX_set_cipher_list", NULL}, + {NULL, NULL}}; + + +/* Similar array as ssl_sw. These functions could be located in different + * lib. */ +#if !defined(NO_SSL) +static struct ssl_func crypto_sw[] = {{"CRYPTO_num_locks", NULL}, + {"CRYPTO_set_locking_callback", NULL}, + {"CRYPTO_set_id_callback", NULL}, + {"ERR_get_error", NULL}, + {"ERR_error_string", NULL}, + {"ERR_remove_state", NULL}, + {"ERR_free_strings", NULL}, + {"ENGINE_cleanup", NULL}, + {"CONF_modules_unload", NULL}, + {"CRYPTO_cleanup_all_ex_data", NULL}, + {"EVP_cleanup", NULL}, + {NULL, NULL}}; +#endif /* NO_SSL */ +#endif /* NO_SSL_DL */ + + +#if !defined(NO_CACHING) +static const char *month_names[] = {"Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec"}; +#endif /* !NO_CACHING */ + +/* Unified socket address. For IPv6 support, add IPv6 address structure in the + * union u. */ +union usa { + struct sockaddr sa; + struct sockaddr_in sin; +#if defined(USE_IPV6) + struct sockaddr_in6 sin6; +#endif +}; + +/* Describes a string (chunk of memory). */ +struct vec { + const char *ptr; + size_t len; +}; + +struct file { + uint64_t size; + time_t last_modified; + FILE *fp; + const char *membuf; /* Non-NULL if file data is in memory */ + int is_directory; + int gzipped; /* set to 1 if the content is gzipped + * in which case we need a content-encoding: gzip header */ +}; + +#define STRUCT_FILE_INITIALIZER \ + { \ + (uint64_t)0, (time_t)0, (FILE *)NULL, (const char *)NULL, 0, 0 \ + } + +/* Describes listening socket, or socket which was accept()-ed by the master + * thread and queued for future handling by the worker thread. */ +struct socket { + SOCKET sock; /* Listening socket */ + union usa lsa; /* Local socket address */ + union usa rsa; /* Remote socket address */ + unsigned char is_ssl; /* Is port SSL-ed */ + unsigned char ssl_redir; /* Is port supposed to redirect everything to SSL + * port */ +}; + +/* NOTE(lsm): this enum shoulds be in sync with the config_options below. */ +enum { + CGI_EXTENSIONS, + CGI_ENVIRONMENT, + PUT_DELETE_PASSWORDS_FILE, + CGI_INTERPRETER, + PROTECT_URI, + AUTHENTICATION_DOMAIN, + SSI_EXTENSIONS, + THROTTLE, + ACCESS_LOG_FILE, + ENABLE_DIRECTORY_LISTING, + ERROR_LOG_FILE, + GLOBAL_PASSWORDS_FILE, + INDEX_FILES, + ENABLE_KEEP_ALIVE, + ACCESS_CONTROL_LIST, + EXTRA_MIME_TYPES, + LISTENING_PORTS, + DOCUMENT_ROOT, + SSL_CERTIFICATE, + NUM_THREADS, + RUN_AS_USER, + REWRITE, + HIDE_FILES, + REQUEST_TIMEOUT, + SSL_DO_VERIFY_PEER, + SSL_CA_PATH, + SSL_CA_FILE, + SSL_VERIFY_DEPTH, + SSL_DEFAULT_VERIFY_PATHS, + SSL_CIPHER_LIST, + SSL_PROTOCOL_VERSION, + SSL_SHORT_TRUST, +#if defined(USE_WEBSOCKET) + WEBSOCKET_TIMEOUT, +#endif + DECODE_URL, + +#if defined(USE_LUA) + LUA_PRELOAD_FILE, + LUA_SCRIPT_EXTENSIONS, + LUA_SERVER_PAGE_EXTENSIONS, +#endif +#if defined(USE_DUKTAPE) + DUKTAPE_SCRIPT_EXTENSIONS, +#endif + +#if defined(USE_WEBSOCKET) + WEBSOCKET_ROOT, +#endif +#if defined(USE_LUA) && defined(USE_WEBSOCKET) + LUA_WEBSOCKET_EXTENSIONS, +#endif + ACCESS_CONTROL_ALLOW_ORIGIN, + ERROR_PAGES, + CONFIG_TCP_NODELAY, /* Prepended CONFIG_ to avoid conflict with the + * socket option typedef TCP_NODELAY. */ +#if !defined(NO_CACHING) + STATIC_FILE_MAX_AGE, +#endif + + NUM_OPTIONS +}; + + +/* Config option name, config types, default value */ +static struct mg_option config_options[] = { + {"cgi_pattern", CONFIG_TYPE_EXT_PATTERN, "**.cgi$|**.pl$|**.php$"}, + {"cgi_environment", CONFIG_TYPE_STRING, NULL}, + {"put_delete_auth_file", CONFIG_TYPE_FILE, NULL}, + {"cgi_interpreter", CONFIG_TYPE_FILE, NULL}, + {"protect_uri", CONFIG_TYPE_STRING, NULL}, + {"authentication_domain", CONFIG_TYPE_STRING, "mydomain.com"}, + {"ssi_pattern", CONFIG_TYPE_EXT_PATTERN, "**.shtml$|**.shtm$"}, + {"throttle", CONFIG_TYPE_STRING, NULL}, + {"access_log_file", CONFIG_TYPE_FILE, NULL}, + {"enable_directory_listing", CONFIG_TYPE_BOOLEAN, "yes"}, + {"error_log_file", CONFIG_TYPE_FILE, NULL}, + {"global_auth_file", CONFIG_TYPE_FILE, NULL}, + {"index_files", + CONFIG_TYPE_STRING, +#ifdef USE_LUA + "index.xhtml,index.html,index.htm,index.lp,index.lsp,index.lua,index.cgi," + "index.shtml,index.php"}, +#else + "index.xhtml,index.html,index.htm,index.cgi,index.shtml,index.php"}, +#endif + {"enable_keep_alive", CONFIG_TYPE_BOOLEAN, "no"}, + {"access_control_list", CONFIG_TYPE_STRING, NULL}, + {"extra_mime_types", CONFIG_TYPE_STRING, NULL}, + {"listening_ports", CONFIG_TYPE_STRING, "8080"}, + {"document_root", CONFIG_TYPE_DIRECTORY, NULL}, + {"ssl_certificate", CONFIG_TYPE_FILE, NULL}, + {"num_threads", CONFIG_TYPE_NUMBER, "50"}, + {"run_as_user", CONFIG_TYPE_STRING, NULL}, + {"url_rewrite_patterns", CONFIG_TYPE_STRING, NULL}, + {"hide_files_patterns", CONFIG_TYPE_EXT_PATTERN, NULL}, + {"request_timeout_ms", CONFIG_TYPE_NUMBER, "30000"}, + {"ssl_verify_peer", CONFIG_TYPE_BOOLEAN, "no"}, + {"ssl_ca_path", CONFIG_TYPE_DIRECTORY, NULL}, + {"ssl_ca_file", CONFIG_TYPE_FILE, NULL}, + {"ssl_verify_depth", CONFIG_TYPE_NUMBER, "9"}, + {"ssl_default_verify_paths", CONFIG_TYPE_BOOLEAN, "yes"}, + {"ssl_cipher_list", CONFIG_TYPE_STRING, NULL}, + {"ssl_protocol_version", CONFIG_TYPE_NUMBER, "0"}, + {"ssl_short_trust", CONFIG_TYPE_BOOLEAN, "no"}, +#if defined(USE_WEBSOCKET) + {"websocket_timeout_ms", CONFIG_TYPE_NUMBER, "30000"}, +#endif + {"decode_url", CONFIG_TYPE_BOOLEAN, "yes"}, + +#if defined(USE_LUA) + {"lua_preload_file", CONFIG_TYPE_FILE, NULL}, + {"lua_script_pattern", CONFIG_TYPE_EXT_PATTERN, "**.lua$"}, + {"lua_server_page_pattern", CONFIG_TYPE_EXT_PATTERN, "**.lp$|**.lsp$"}, +#endif +#if defined(USE_DUKTAPE) + /* The support for duktape is still in alpha version state. + * The name of this config option might change. */ + {"duktape_script_pattern", CONFIG_TYPE_EXT_PATTERN, "**.ssjs$"}, +#endif + +#if defined(USE_WEBSOCKET) + {"websocket_root", CONFIG_TYPE_DIRECTORY, NULL}, +#endif +#if defined(USE_LUA) && defined(USE_WEBSOCKET) + {"lua_websocket_pattern", CONFIG_TYPE_EXT_PATTERN, "**.lua$"}, +#endif + {"access_control_allow_origin", CONFIG_TYPE_STRING, "*"}, + {"error_pages", CONFIG_TYPE_DIRECTORY, NULL}, + {"tcp_nodelay", CONFIG_TYPE_NUMBER, "0"}, +#if !defined(NO_CACHING) + {"static_file_max_age", CONFIG_TYPE_NUMBER, "3600"}, +#endif + + {NULL, CONFIG_TYPE_UNKNOWN, NULL}}; + +/* Check if the config_options and the corresponding enum have compatible + * sizes. */ +mg_static_assert((sizeof(config_options) / sizeof(config_options[0])) + == (NUM_OPTIONS + 1), + "config_options and enum not sync"); + +enum { REQUEST_HANDLER, WEBSOCKET_HANDLER, AUTH_HANDLER }; + +struct mg_handler_info { + /* Name/Pattern of the URI. */ + char *uri; + size_t uri_len; + + /* handler type */ + int handler_type; + + /* Handler for http/https or authorization requests. */ + mg_request_handler handler; + + /* Handler for ws/wss (websocket) requests. */ + mg_websocket_connect_handler connect_handler; + mg_websocket_ready_handler ready_handler; + mg_websocket_data_handler data_handler; + mg_websocket_close_handler close_handler; + + /* Handler for authorization requests */ + mg_authorization_handler auth_handler; + + /* User supplied argument for the handler function. */ + void *cbdata; + + /* next handler in a linked list */ + struct mg_handler_info *next; +}; + +struct mg_context { + volatile int stop_flag; /* Should we stop event loop */ + SSL_CTX *ssl_ctx; /* SSL context */ + char *config[NUM_OPTIONS]; /* Civetweb configuration parameters */ + struct mg_callbacks callbacks; /* User-defined callback function */ + void *user_data; /* User-defined data */ + int context_type; /* 1 = server context, 2 = client context */ + + struct socket *listening_sockets; + in_port_t *listening_ports; + unsigned int num_listening_sockets; + + volatile int + running_worker_threads; /* Number of currently running worker threads */ + pthread_mutex_t thread_mutex; /* Protects (max|num)_threads */ + pthread_cond_t thread_cond; /* Condvar for tracking workers terminations */ + + struct socket queue[MGSQLEN]; /* Accepted sockets */ + volatile int sq_head; /* Head of the socket queue */ + volatile int sq_tail; /* Tail of the socket queue */ + pthread_cond_t sq_full; /* Signaled when socket is produced */ + pthread_cond_t sq_empty; /* Signaled when socket is consumed */ + pthread_t masterthreadid; /* The master thread ID */ + unsigned int + cfg_worker_threads; /* The number of configured worker threads. */ + pthread_t *workerthreadids; /* The worker thread IDs */ + + time_t start_time; /* Server start time, used for authentication */ + uint64_t auth_nonce_mask; /* Mask for all nonce values */ + pthread_mutex_t nonce_mutex; /* Protects nonce_count */ + unsigned long nonce_count; /* Used nonces, used for authentication */ + + char *systemName; /* What operating system is running */ + + /* linked list of uri handlers */ + struct mg_handler_info *handlers; + +#if defined(USE_LUA) && defined(USE_WEBSOCKET) + /* linked list of shared lua websockets */ + struct mg_shared_lua_websocket_list *shared_lua_websockets; +#endif + +#ifdef USE_TIMERS + struct ttimers *timers; +#endif +}; + + +struct mg_connection { + struct mg_request_info request_info; + struct mg_context *ctx; + SSL *ssl; /* SSL descriptor */ + SSL_CTX *client_ssl_ctx; /* SSL context for client connections */ + struct socket client; /* Connected client */ + time_t conn_birth_time; /* Time (wall clock) when connection was + * established */ + struct timespec req_time; /* Time (since system start) when the request + * was received */ + int64_t num_bytes_sent; /* Total bytes sent to client */ + int64_t content_len; /* Content-Length header value */ + int64_t consumed_content; /* How many bytes of content have been read */ + int is_chunked; /* Transfer-Encoding is chunked: 0=no, 1=yes: + * data available, 2: all data read */ + size_t chunk_remainder; /* Unread data from the last chunk */ + char *buf; /* Buffer for received data */ + char *path_info; /* PATH_INFO part of the URL */ + + int must_close; /* 1 if connection must be closed */ + int in_error_handler; /* 1 if in handler for user defined error + * pages */ + int internal_error; /* 1 if an error occured while processing the + * request */ + + int buf_size; /* Buffer size */ + int request_len; /* Size of the request + headers in a buffer */ + int data_len; /* Total size of data in a buffer */ + int status_code; /* HTTP reply status code, e.g. 200 */ + int throttle; /* Throttling, bytes/sec. <= 0 means no + * throttle */ + time_t last_throttle_time; /* Last time throttled data was sent */ + int64_t last_throttle_bytes; /* Bytes sent this second */ + pthread_mutex_t mutex; /* Used by mg_(un)lock_connection to ensure + * atomic transmissions for websockets */ +#if defined(USE_LUA) && defined(USE_WEBSOCKET) + void *lua_websocket_state; /* Lua_State for a websocket connection */ +#endif +}; + + +static pthread_key_t sTlsKey; /* Thread local storage index */ +static int sTlsInit = 0; +static int thread_idx_max = 0; + + +struct mg_workerTLS { + int is_master; + unsigned long thread_idx; +#if defined(_WIN32) && !defined(__SYMBIAN32__) + HANDLE pthread_cond_helper_mutex; +#endif +}; + +/* Directory entry */ +struct de { + struct mg_connection *conn; + char *file_name; + struct file file; +}; + + +#if defined(USE_WEBSOCKET) +static int is_websocket_protocol(const struct mg_connection *conn); +#else +#define is_websocket_protocol(conn) (0) +#endif + + +static int +mg_atomic_inc(volatile int *addr) +{ + int ret; +#if defined(_WIN32) && !defined(__SYMBIAN32__) + /* Depending on the SDK, this function uses either + * (volatile unsigned int *) or (volatile LONG *), + * so whatever you use, the other SDK is likely to raise a warning. */ + ret = InterlockedIncrement((volatile long *)addr); +#elif defined(__GNUC__) \ + && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 0))) + ret = __sync_add_and_fetch(addr, 1); +#else + ret = (++(*addr)); +#endif + return ret; +} + + +static int +mg_atomic_dec(volatile int *addr) +{ + int ret; +#if defined(_WIN32) && !defined(__SYMBIAN32__) + /* Depending on the SDK, this function uses either + * (volatile unsigned int *) or (volatile LONG *), + * so whatever you use, the other SDK is likely to raise a warning. */ + ret = InterlockedDecrement((volatile long *)addr); +#elif defined(__GNUC__) \ + && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 0))) + ret = __sync_sub_and_fetch(addr, 1); +#else + ret = (--(*addr)); +#endif + return ret; +} + +#if !defined(NO_THREAD_NAME) +#if defined(_WIN32) && defined(_MSC_VER) +/* Set the thread name for debugging purposes in Visual Studio + * http://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx + */ +#pragma pack(push, 8) +typedef struct tagTHREADNAME_INFO { + DWORD dwType; /* Must be 0x1000. */ + LPCSTR szName; /* Pointer to name (in user addr space). */ + DWORD dwThreadID; /* Thread ID (-1=caller thread). */ + DWORD dwFlags; /* Reserved for future use, must be zero. */ +} THREADNAME_INFO; +#pragma pack(pop) +#elif defined(__linux__) +#include +#include +#endif + + +static void +mg_set_thread_name(const char *name) +{ + char threadName[16 + 1]; /* 16 = Max. thread length in Linux/OSX/.. */ + + mg_snprintf( + NULL, NULL, threadName, sizeof(threadName), "civetweb-%s", name); + +#if defined(_WIN32) +#if defined(_MSC_VER) + /* Windows and Visual Studio Compiler */ + __try + { + THREADNAME_INFO info; + info.dwType = 0x1000; + info.szName = threadName; + info.dwThreadID = ~0U; + info.dwFlags = 0; + + RaiseException(0x406D1388, + 0, + sizeof(info) / sizeof(ULONG_PTR), + (ULONG_PTR *)&info); + } + __except(EXCEPTION_EXECUTE_HANDLER) + { + } +#elif defined(__MINGW32__) +/* No option known to set thread name for MinGW */ +#endif +#elif defined(__GLIBC__) \ + && ((__GLIBC__ > 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 12))) + /* pthread_setname_np first appeared in glibc in version 2.12*/ + (void)pthread_setname_np(pthread_self(), threadName); +#elif defined(__linux__) + /* on linux we can use the old prctl function */ + (void)prctl(PR_SET_NAME, threadName, 0, 0, 0); +#endif +} +#else /* !defined(NO_THREAD_NAME) */ +void +mg_set_thread_name(const char *threadName) +{ +} +#endif + + +#if defined(MG_LEGACY_INTERFACE) +const char ** +mg_get_valid_option_names(void) +{ + /* This function is deprecated. Use mg_get_valid_options instead. */ + static const char * + data[2 * sizeof(config_options) / sizeof(config_options[0])] = {0}; + int i; + + for (i = 0; config_options[i].name != NULL; i++) { + data[i * 2] = config_options[i].name; + data[i * 2 + 1] = config_options[i].default_value; + } + + return data; +} +#endif + + +const struct mg_option * +mg_get_valid_options(void) +{ + return config_options; +} + + +static int +is_file_in_memory(const struct mg_connection *conn, + const char *path, + struct file *filep) +{ + size_t size = 0; + if (!conn || !filep) { + return 0; + } + + if (conn->ctx->callbacks.open_file) { + filep->membuf = conn->ctx->callbacks.open_file(conn, path, &size); + if (filep->membuf != NULL) { + /* NOTE: override filep->size only on success. Otherwise, it might + * break constructs like if (!mg_stat() || !mg_fopen()) ... */ + filep->size = size; + } + } + + return filep->membuf != NULL; +} + + +static int +is_file_opened(const struct file *filep) +{ + if (!filep) { + return 0; + } + + return filep->membuf != NULL || filep->fp != NULL; +} + + +/* mg_fopen will open a file either in memory or on the disk. + * The input parameter path is a string in UTF-8 encoding. + * The input parameter mode is the same as for fopen. + * Either fp or membuf will be set in the output struct filep. + * The function returns 1 on success, 0 on error. */ +static int +mg_fopen(const struct mg_connection *conn, + const char *path, + const char *mode, + struct file *filep) +{ + struct stat st; + + if (!filep) { + return 0; + } + + /* TODO (high): mg_fopen should only open a file, while mg_stat should + * only get the file status. They should not work on different members of + * the same structure (bad cohesion). */ + memset(filep, 0, sizeof(*filep)); + + if (stat(path, &st) == 0) { + filep->size = (uint64_t)(st.st_size); + } + + if (!is_file_in_memory(conn, path, filep)) { +#ifdef _WIN32 + wchar_t wbuf[PATH_MAX], wmode[20]; + path_to_unicode(conn, path, wbuf, ARRAY_SIZE(wbuf)); + MultiByteToWideChar(CP_UTF8, 0, mode, -1, wmode, ARRAY_SIZE(wmode)); + filep->fp = _wfopen(wbuf, wmode); +#else + /* Linux et al already use unicode. No need to convert. */ + filep->fp = fopen(path, mode); +#endif + } + + return is_file_opened(filep); +} + + +static void +mg_fclose(struct file *filep) +{ + if (filep != NULL && filep->fp != NULL) { + fclose(filep->fp); + } +} + + +static void +mg_strlcpy(register char *dst, register const char *src, size_t n) +{ + for (; *src != '\0' && n > 1; n--) { + *dst++ = *src++; + } + *dst = '\0'; +} + + +static int +lowercase(const char *s) +{ + return tolower(*(const unsigned char *)s); +} + + +int +mg_strncasecmp(const char *s1, const char *s2, size_t len) +{ + int diff = 0; + + if (len > 0) { + do { + diff = lowercase(s1++) - lowercase(s2++); + } while (diff == 0 && s1[-1] != '\0' && --len > 0); + } + + return diff; +} + + +int +mg_strcasecmp(const char *s1, const char *s2) +{ + int diff; + + do { + diff = lowercase(s1++) - lowercase(s2++); + } while (diff == 0 && s1[-1] != '\0'); + + return diff; +} + + +static char * +mg_strndup(const char *ptr, size_t len) +{ + char *p; + + if ((p = (char *)mg_malloc(len + 1)) != NULL) { + mg_strlcpy(p, ptr, len + 1); + } + + return p; +} + + +static char * +mg_strdup(const char *str) +{ + return mg_strndup(str, strlen(str)); +} + + +static const char * +mg_strcasestr(const char *big_str, const char *small_str) +{ + size_t i, big_len = strlen(big_str), small_len = strlen(small_str); + + if (big_len >= small_len) { + for (i = 0; i <= (big_len - small_len); i++) { + if (mg_strncasecmp(big_str + i, small_str, small_len) == 0) { + return big_str + i; + } + } + } + + return NULL; +} + + +/* Return null terminated string of given maximum length. + * Report errors if length is exceeded. */ +static void +mg_vsnprintf(const struct mg_connection *conn, + int *truncated, + char *buf, + size_t buflen, + const char *fmt, + va_list ap) +{ + int n, ok; + + if (buflen == 0) { + return; + } + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wformat-nonliteral" +/* Using fmt as a non-literal is intended here, since it is mostly called + * indirectly by mg_snprintf */ +#endif + + n = (int)vsnprintf_impl(buf, buflen, fmt, ap); + ok = (n >= 0) && ((size_t)n < buflen); + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + + if (ok) { + if (truncated) { + *truncated = 0; + } + } else { + if (truncated) { + *truncated = 1; + } + mg_cry(conn, + "truncating vsnprintf buffer: [%.*s]", + (int)((buflen > 200) ? 200 : (buflen - 1)), + buf); + n = (int)buflen - 1; + } + buf[n] = '\0'; +} + + +static void +mg_snprintf(const struct mg_connection *conn, + int *truncated, + char *buf, + size_t buflen, + const char *fmt, + ...) +{ + va_list ap; + + va_start(ap, fmt); + mg_vsnprintf(conn, truncated, buf, buflen, fmt, ap); + va_end(ap); +} + + +static int +get_option_index(const char *name) +{ + int i; + + for (i = 0; config_options[i].name != NULL; i++) { + if (strcmp(config_options[i].name, name) == 0) { + return i; + } + } + return -1; +} + + +const char * +mg_get_option(const struct mg_context *ctx, const char *name) +{ + int i; + if ((i = get_option_index(name)) == -1) { + return NULL; + } else if (!ctx || ctx->config[i] == NULL) { + return ""; + } else { + return ctx->config[i]; + } +} + + +struct mg_context * +mg_get_context(const struct mg_connection *conn) +{ + return (conn == NULL) ? (struct mg_context *)NULL : (conn->ctx); +} + + +void * +mg_get_user_data(const struct mg_context *ctx) +{ + return (ctx == NULL) ? NULL : ctx->user_data; +} + + +void +mg_set_user_connection_data(struct mg_connection *conn, void *data) +{ + if (conn != NULL) { + conn->request_info.conn_data = data; + } +} + + +void * +mg_get_user_connection_data(const struct mg_connection *conn) +{ + if (conn != NULL) { + return conn->request_info.conn_data; + } + return NULL; +} + + +size_t +mg_get_ports(const struct mg_context *ctx, size_t size, int *ports, int *ssl) +{ + size_t i; + if (!ctx) { + return 0; + } + for (i = 0; i < size && i < ctx->num_listening_sockets; i++) { + ssl[i] = ctx->listening_sockets[i].is_ssl; + ports[i] = ctx->listening_ports[i]; + } + return i; +} + + +int +mg_get_server_ports(const struct mg_context *ctx, + int size, + struct mg_server_ports *ports) +{ + int i, cnt = 0; + + if (size <= 0) { + return -1; + } + memset(ports, 0, sizeof(*ports) * (size_t)size); + if (!ctx) { + return -1; + } + if (!ctx->listening_sockets || !ctx->listening_ports) { + return -1; + } + + for (i = 0; (i < size) && (i < (int)ctx->num_listening_sockets); i++) { + + ports[cnt].port = ctx->listening_ports[i]; + ports[cnt].is_ssl = ctx->listening_sockets[i].is_ssl; + ports[cnt].is_redirect = ctx->listening_sockets[i].ssl_redir; + + if (ctx->listening_sockets[i].lsa.sa.sa_family == AF_INET) { + /* IPv4 */ + ports[cnt].protocol = 1; + cnt++; + } else if (ctx->listening_sockets[i].lsa.sa.sa_family == AF_INET6) { + /* IPv6 */ + ports[cnt].protocol = 3; + cnt++; + } + } + + return cnt; +} + + +static void +sockaddr_to_string(char *buf, size_t len, const union usa *usa) +{ + buf[0] = '\0'; + + if (!usa) { + return; + } + + if (usa->sa.sa_family == AF_INET) { + getnameinfo(&usa->sa, + sizeof(usa->sin), + buf, + (unsigned)len, + NULL, + 0, + NI_NUMERICHOST); + } +#if defined(USE_IPV6) + else if (usa->sa.sa_family == AF_INET6) { + getnameinfo(&usa->sa, + sizeof(usa->sin6), + buf, + (unsigned)len, + NULL, + 0, + NI_NUMERICHOST); + } +#endif +} + + +/* Convert time_t to a string. According to RFC2616, Sec 14.18, this must be + * included in all responses other than 100, 101, 5xx. */ +static void +gmt_time_string(char *buf, size_t buf_len, time_t *t) +{ + struct tm *tm; + + tm = ((t != NULL) ? gmtime(t) : NULL); + if (tm != NULL) { + strftime(buf, buf_len, "%a, %d %b %Y %H:%M:%S GMT", tm); + } else { + mg_strlcpy(buf, "Thu, 01 Jan 1970 00:00:00 GMT", buf_len); + buf[buf_len - 1] = '\0'; + } +} + + +/* difftime for struct timespec. Return value is in seconds. */ +static double +mg_difftimespec(const struct timespec *ts_now, const struct timespec *ts_before) +{ + return (double)(ts_now->tv_nsec - ts_before->tv_nsec) * 1.0E-9 + + (double)(ts_now->tv_sec - ts_before->tv_sec); +} + + +/* Print error message to the opened error log stream. */ +void +mg_cry(const struct mg_connection *conn, const char *fmt, ...) +{ + char buf[MG_BUF_LEN], src_addr[IP_ADDR_STR_LEN]; + va_list ap; + struct file fi; + time_t timestamp; + + va_start(ap, fmt); + IGNORE_UNUSED_RESULT(vsnprintf_impl(buf, sizeof(buf), fmt, ap)); + va_end(ap); + buf[sizeof(buf) - 1] = 0; + + if (!conn) { + puts(buf); + return; + } + + /* Do not lock when getting the callback value, here and below. + * I suppose this is fine, since function cannot disappear in the + * same way string option can. */ + if ((conn->ctx->callbacks.log_message == NULL) + || (conn->ctx->callbacks.log_message(conn, buf) == 0)) { + + if (conn->ctx->config[ERROR_LOG_FILE] != NULL) { + if (mg_fopen(conn, conn->ctx->config[ERROR_LOG_FILE], "a+", &fi) + == 0) { + fi.fp = NULL; + } + } else { + fi.fp = NULL; + } + + if (fi.fp != NULL) { + flockfile(fi.fp); + timestamp = time(NULL); + + sockaddr_to_string(src_addr, sizeof(src_addr), &conn->client.rsa); + fprintf(fi.fp, + "[%010lu] [error] [client %s] ", + (unsigned long)timestamp, + src_addr); + + if (conn->request_info.request_method != NULL) { + fprintf(fi.fp, + "%s %s: ", + conn->request_info.request_method, + conn->request_info.request_uri); + } + + fprintf(fi.fp, "%s", buf); + fputc('\n', fi.fp); + fflush(fi.fp); + funlockfile(fi.fp); + mg_fclose(&fi); + } + } +} + + +/* Return fake connection structure. Used for logging, if connection + * is not applicable at the moment of logging. */ +static struct mg_connection * +fc(struct mg_context *ctx) +{ + static struct mg_connection fake_connection; + fake_connection.ctx = ctx; + return &fake_connection; +} + + +const char * +mg_version(void) +{ + return CIVETWEB_VERSION; +} + + +const struct mg_request_info * +mg_get_request_info(const struct mg_connection *conn) +{ + if (!conn) { + return NULL; + } + return &conn->request_info; +} + + +/* Skip the characters until one of the delimiters characters found. + * 0-terminate resulting word. Skip the delimiter and following whitespaces. + * Advance pointer to buffer to the next word. Return found 0-terminated word. + * Delimiters can be quoted with quotechar. */ +static char * +skip_quoted(char **buf, + const char *delimiters, + const char *whitespace, + char quotechar) +{ + char *p, *begin_word, *end_word, *end_whitespace; + + begin_word = *buf; + end_word = begin_word + strcspn(begin_word, delimiters); + + /* Check for quotechar */ + if (end_word > begin_word) { + p = end_word - 1; + while (*p == quotechar) { + /* While the delimiter is quoted, look for the next delimiter. */ + /* This happens, e.g., in calls from parse_auth_header, + * if the user name contains a " character. */ + + /* If there is anything beyond end_word, copy it. */ + if (*end_word != '\0') { + size_t end_off = strcspn(end_word + 1, delimiters); + memmove(p, end_word, end_off + 1); + p += end_off; /* p must correspond to end_word - 1 */ + end_word += end_off + 1; + } else { + *p = '\0'; + break; + } + } + for (p++; p < end_word; p++) { + *p = '\0'; + } + } + + if (*end_word == '\0') { + *buf = end_word; + } else { + end_whitespace = end_word + 1 + strspn(end_word + 1, whitespace); + + for (p = end_word; p < end_whitespace; p++) { + *p = '\0'; + } + + *buf = end_whitespace; + } + + return begin_word; +} + + +/* Simplified version of skip_quoted without quote char + * and whitespace == delimiters */ +static char * +skip(char **buf, const char *delimiters) +{ + return skip_quoted(buf, delimiters, delimiters, 0); +} + + +/* Return HTTP header value, or NULL if not found. */ +static const char * +get_header(const struct mg_request_info *ri, const char *name) +{ + int i; + if (ri) { + for (i = 0; i < ri->num_headers; i++) { + if (!mg_strcasecmp(name, ri->http_headers[i].name)) { + return ri->http_headers[i].value; + } + } + } + + return NULL; +} + + +const char * +mg_get_header(const struct mg_connection *conn, const char *name) +{ + if (!conn) { + return NULL; + } + + return get_header(&conn->request_info, name); +} + + +/* A helper function for traversing a comma separated list of values. + * It returns a list pointer shifted to the next value, or NULL if the end + * of the list found. + * Value is stored in val vector. If value has form "x=y", then eq_val + * vector is initialized to point to the "y" part, and val vector length + * is adjusted to point only to "x". */ +static const char * +next_option(const char *list, struct vec *val, struct vec *eq_val) +{ + int end; + +reparse: + if (val == NULL || list == NULL || *list == '\0') { + /* End of the list */ + list = NULL; + } else { + /* Skip over leading LWS */ + while (*list == ' ' || *list == '\t') + list++; + + val->ptr = list; + if ((list = strchr(val->ptr, ',')) != NULL) { + /* Comma found. Store length and shift the list ptr */ + val->len = ((size_t)(list - val->ptr)); + list++; + } else { + /* This value is the last one */ + list = val->ptr + strlen(val->ptr); + val->len = ((size_t)(list - val->ptr)); + } + + /* Adjust length for trailing LWS */ + end = (int)val->len - 1; + while (end >= 0 && (val->ptr[end] == ' ' || val->ptr[end] == '\t')) + end--; + val->len = (size_t)(end + 1); + + if (val->len == 0) { + /* Ignore any empty entries. */ + goto reparse; + } + + if (eq_val != NULL) { + /* Value has form "x=y", adjust pointers and lengths + * so that val points to "x", and eq_val points to "y". */ + eq_val->len = 0; + eq_val->ptr = (const char *)memchr(val->ptr, '=', val->len); + if (eq_val->ptr != NULL) { + eq_val->ptr++; /* Skip over '=' character */ + eq_val->len = ((size_t)(val->ptr - eq_val->ptr)) + val->len; + val->len = ((size_t)(eq_val->ptr - val->ptr)) - 1; + } + } + } + + return list; +} + +/* A helper function for checking if a comma separated list of values contains + * the given option (case insensitvely). + * 'header' can be NULL, in which case false is returned. */ +static int +header_has_option(const char *header, const char *option) +{ + struct vec opt_vec; + struct vec eq_vec; + + assert(option != NULL); + assert(option[0] != '\0'); + + while ((header = next_option(header, &opt_vec, &eq_vec)) != NULL) { + if (mg_strncasecmp(option, opt_vec.ptr, opt_vec.len) == 0) + return 1; + } + + return 0; +} + +/* Perform case-insensitive match of string against pattern */ +static int +match_prefix(const char *pattern, size_t pattern_len, const char *str) +{ + const char *or_str; + size_t i; + int j, len, res; + + if ((or_str = (const char *)memchr(pattern, '|', pattern_len)) != NULL) { + res = match_prefix(pattern, (size_t)(or_str - pattern), str); + return res > 0 ? res : match_prefix(or_str + 1, + (size_t)((pattern + pattern_len) + - (or_str + 1)), + str); + } + + for (i = 0, j = 0; i < pattern_len; i++, j++) { + if (pattern[i] == '?' && str[j] != '\0') { + continue; + } else if (pattern[i] == '$') { + return str[j] == '\0' ? j : -1; + } else if (pattern[i] == '*') { + i++; + if (pattern[i] == '*') { + i++; + len = (int)strlen(str + j); + } else { + len = (int)strcspn(str + j, "/"); + } + if (i == pattern_len) { + return j + len; + } + do { + res = match_prefix(pattern + i, pattern_len - i, str + j + len); + } while (res == -1 && len-- > 0); + return res == -1 ? -1 : j + res + len; + } else if (lowercase(&pattern[i]) != lowercase(&str[j])) { + return -1; + } + } + return j; +} + + +/* HTTP 1.1 assumes keep alive if "Connection:" header is not set + * This function must tolerate situations when connection info is not + * set up, for example if request parsing failed. */ +static int +should_keep_alive(const struct mg_connection *conn) +{ + if (conn != NULL) { + const char *http_version = conn->request_info.http_version; + const char *header = mg_get_header(conn, "Connection"); + if (conn->must_close || conn->internal_error || conn->status_code == 401 + || mg_strcasecmp(conn->ctx->config[ENABLE_KEEP_ALIVE], "yes") != 0 + || (header != NULL && !header_has_option(header, "keep-alive")) + || (header == NULL && http_version + && 0 != strcmp(http_version, "1.1"))) { + return 0; + } + return 1; + } + return 0; +} + + +static int +should_decode_url(const struct mg_connection *conn) +{ + if (!conn || !conn->ctx) { + return 0; + } + + return (mg_strcasecmp(conn->ctx->config[DECODE_URL], "yes") == 0); +} + + +static const char * +suggest_connection_header(const struct mg_connection *conn) +{ + return should_keep_alive(conn) ? "keep-alive" : "close"; +} + + +static int +send_no_cache_header(struct mg_connection *conn) +{ + /* Send all current and obsolete cache opt-out directives. */ + return mg_printf(conn, + "Cache-Control: no-cache, no-store, " + "must-revalidate, private, max-age=0\r\n" + "Pragma: no-cache\r\n" + "Expires: 0\r\n"); +} + + +static int +send_static_cache_header(struct mg_connection *conn) +{ +#if !defined(NO_CACHING) + /* Read the server config to check how long a file may be cached. + * The configuration is in seconds. */ + int max_age = atoi(conn->ctx->config[STATIC_FILE_MAX_AGE]); + if (max_age <= 0) { + /* 0 means "do not cache". All values <0 are reserved + * and may be used differently in the future. */ + /* If a file should not be cached, do not only send + * max-age=0, but also pragmas and Expires headers. */ + return send_no_cache_header(conn); + } + + /* Use "Cache-Control: max-age" instead of "Expires" header. + * Reason: see https://www.mnot.net/blog/2007/05/15/expires_max-age */ + /* See also https://www.mnot.net/cache_docs/ */ + /* According to RFC 2616, Section 14.21, caching times should not exceed + * one year. A year with 365 days corresponds to 31536000 seconds, a leap + * year to 31622400 seconds. For the moment, we just send whatever has + * been configured, still the behavior for >1 year should be considered + * as undefined. */ + return mg_printf(conn, "Cache-Control: max-age=%u\r\n", (unsigned)max_age); +#else /* NO_CACHING */ + return send_no_cache_header(conn); +#endif /* !NO_CACHING */ +} + + +static void handle_file_based_request(struct mg_connection *conn, + const char *path, + struct file *filep); + +static int +mg_stat(struct mg_connection *conn, const char *path, struct file *filep); + + +const char * +mg_get_response_code_text(struct mg_connection *conn, int response_code) +{ + /* See IANA HTTP status code assignment: + * http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml + */ + + switch (response_code) { + /* RFC2616 Section 10.1 - Informational 1xx */ + case 100: + return "Continue"; /* RFC2616 Section 10.1.1 */ + case 101: + return "Switching Protocols"; /* RFC2616 Section 10.1.2 */ + case 102: + return "Processing"; /* RFC2518 Section 10.1 */ + + /* RFC2616 Section 10.2 - Successful 2xx */ + case 200: + return "OK"; /* RFC2616 Section 10.2.1 */ + case 201: + return "Created"; /* RFC2616 Section 10.2.2 */ + case 202: + return "Accepted"; /* RFC2616 Section 10.2.3 */ + case 203: + return "Non-Authoritative Information"; /* RFC2616 Section 10.2.4 */ + case 204: + return "No Content"; /* RFC2616 Section 10.2.5 */ + case 205: + return "Reset Content"; /* RFC2616 Section 10.2.6 */ + case 206: + return "Partial Content"; /* RFC2616 Section 10.2.7 */ + case 207: + return "Multi-Status"; /* RFC2518 Section 10.2, RFC4918 Section 11.1 */ + case 208: + return "Already Reported"; /* RFC5842 Section 7.1 */ + + case 226: + return "IM used"; /* RFC3229 Section 10.4.1 */ + + /* RFC2616 Section 10.3 - Redirection 3xx */ + case 300: + return "Multiple Choices"; /* RFC2616 Section 10.3.1 */ + case 301: + return "Moved Permanently"; /* RFC2616 Section 10.3.2 */ + case 302: + return "Found"; /* RFC2616 Section 10.3.3 */ + case 303: + return "See Other"; /* RFC2616 Section 10.3.4 */ + case 304: + return "Not Modified"; /* RFC2616 Section 10.3.5 */ + case 305: + return "Use Proxy"; /* RFC2616 Section 10.3.6 */ + case 307: + return "Temporary Redirect"; /* RFC2616 Section 10.3.8 */ + case 308: + return "Permanent Redirect"; /* RFC7238 Section 3 */ + + /* RFC2616 Section 10.4 - Client Error 4xx */ + case 400: + return "Bad Request"; /* RFC2616 Section 10.4.1 */ + case 401: + return "Unauthorized"; /* RFC2616 Section 10.4.2 */ + case 402: + return "Payment Required"; /* RFC2616 Section 10.4.3 */ + case 403: + return "Forbidden"; /* RFC2616 Section 10.4.4 */ + case 404: + return "Not Found"; /* RFC2616 Section 10.4.5 */ + case 405: + return "Method Not Allowed"; /* RFC2616 Section 10.4.6 */ + case 406: + return "Not Acceptable"; /* RFC2616 Section 10.4.7 */ + case 407: + return "Proxy Authentication Required"; /* RFC2616 Section 10.4.8 */ + case 408: + return "Request Time-out"; /* RFC2616 Section 10.4.9 */ + case 409: + return "Conflict"; /* RFC2616 Section 10.4.10 */ + case 410: + return "Gone"; /* RFC2616 Section 10.4.11 */ + case 411: + return "Length Required"; /* RFC2616 Section 10.4.12 */ + case 412: + return "Precondition Failed"; /* RFC2616 Section 10.4.13 */ + case 413: + return "Request Entity Too Large"; /* RFC2616 Section 10.4.14 */ + case 414: + return "Request-URI Too Large"; /* RFC2616 Section 10.4.15 */ + case 415: + return "Unsupported Media Type"; /* RFC2616 Section 10.4.16 */ + case 416: + return "Requested range not satisfiable"; /* RFC2616 Section 10.4.17 */ + case 417: + return "Expectation Failed"; /* RFC2616 Section 10.4.18 */ + + case 421: + return "Misdirected Request"; /* RFC7540 Section 9.1.2 */ + case 422: + return "Unproccessable entity"; /* RFC2518 Section 10.3, RFC4918 + * Section 11.2 */ + case 423: + return "Locked"; /* RFC2518 Section 10.4, RFC4918 Section 11.3 */ + case 424: + return "Failed Dependency"; /* RFC2518 Section 10.5, RFC4918 + * Section 11.4 */ + + case 426: + return "Upgrade Required"; /* RFC 2817 Section 4 */ + + case 428: + return "Precondition Required"; /* RFC 6585, Section 3 */ + case 429: + return "Too Many Requests"; /* RFC 6585, Section 4 */ + + case 431: + return "Request Header Fields Too Large"; /* RFC 6585, Section 5 */ + + case 451: + return "Unavailable For Legal Reasons"; /* draft-tbray-http-legally-restricted-status-05, + * Section 3 */ + + /* RFC2616 Section 10.5 - Server Error 5xx */ + case 500: + return "Internal Server Error"; /* RFC2616 Section 10.5.1 */ + case 501: + return "Not Implemented"; /* RFC2616 Section 10.5.2 */ + case 502: + return "Bad Gateway"; /* RFC2616 Section 10.5.3 */ + case 503: + return "Service Unavailable"; /* RFC2616 Section 10.5.4 */ + case 504: + return "Gateway Time-out"; /* RFC2616 Section 10.5.5 */ + case 505: + return "HTTP Version not supported"; /* RFC2616 Section 10.5.6 */ + case 506: + return "Variant Also Negotiates"; /* RFC 2295, Section 8.1 */ + case 507: + return "Insufficient Storage"; /* RFC2518 Section 10.6, RFC4918 + * Section 11.5 */ + case 508: + return "Loop Detected"; /* RFC5842 Section 7.1 */ + + case 510: + return "Not Extended"; /* RFC 2774, Section 7 */ + case 511: + return "Network Authentication Required"; /* RFC 6585, Section 6 */ + + /* Other status codes, not shown in the IANA HTTP status code assignment. + * E.g., "de facto" standards due to common use, ... */ + case 418: + return "I am a teapot"; /* RFC2324 Section 2.3.2 */ + case 419: + return "Authentication Timeout"; /* common use */ + case 420: + return "Enhance Your Calm"; /* common use */ + case 440: + return "Login Timeout"; /* common use */ + case 509: + return "Bandwidth Limit Exceeded"; /* common use */ + + default: + /* This error code is unknown. This should not happen. */ + if (conn) { + mg_cry(conn, "Unknown HTTP response code: %u", response_code); + } + + /* Return at least a category according to RFC 2616 Section 10. */ + if (response_code >= 100 && response_code < 200) { + /* Unknown informational status code */ + return "Information"; + } + if (response_code >= 200 && response_code < 300) { + /* Unknown success code */ + return "Success"; + } + if (response_code >= 300 && response_code < 400) { + /* Unknown redirection code */ + return "Redirection"; + } + if (response_code >= 400 && response_code < 500) { + /* Unknown request error code */ + return "Client Error"; + } + if (response_code >= 500 && response_code < 600) { + /* Unknown server error code */ + return "Server Error"; + } + + /* Response code not even within reasonable range */ + return ""; + } +} + + +static void send_http_error(struct mg_connection *, + int, + PRINTF_FORMAT_STRING(const char *fmt), + ...) PRINTF_ARGS(3, 4); + +static void +send_http_error(struct mg_connection *conn, int status, const char *fmt, ...) +{ + char buf[MG_BUF_LEN]; + va_list ap; + int len, i, page_handler_found, scope, truncated; + char date[64]; + time_t curtime = time(NULL); + const char *error_handler = NULL; + struct file error_page_file = STRUCT_FILE_INITIALIZER; + const char *error_page_file_ext, *tstr; + + const char *status_text = mg_get_response_code_text(conn, status); + + if (conn == NULL) { + return; + } + + conn->status_code = status; + if (conn->in_error_handler || conn->ctx->callbacks.http_error == NULL + || conn->ctx->callbacks.http_error(conn, status)) { + if (!conn->in_error_handler) { + /* Send user defined error pages, if defined */ + error_handler = conn->ctx->config[ERROR_PAGES]; + error_page_file_ext = conn->ctx->config[INDEX_FILES]; + page_handler_found = 0; + if (error_handler != NULL) { + for (scope = 1; (scope <= 3) && !page_handler_found; scope++) { + switch (scope) { + case 1: /* Handler for specific error, e.g. 404 error */ + mg_snprintf(conn, + &truncated, + buf, + sizeof(buf) - 32, + "%serror%03u.", + error_handler, + status); + break; + case 2: /* Handler for error group, e.g., 5xx error handler + * for all server errors (500-599) */ + mg_snprintf(conn, + &truncated, + buf, + sizeof(buf) - 32, + "%serror%01uxx.", + error_handler, + status / 100); + break; + default: /* Handler for all errors */ + mg_snprintf(conn, + &truncated, + buf, + sizeof(buf) - 32, + "%serror.", + error_handler); + break; + } + + /* String truncation in buf may only occur if error_handler + * is too long. This string is from the config, not from a + * client. */ + (void)truncated; + + len = (int)strlen(buf); + + tstr = strchr(error_page_file_ext, '.'); + + while (tstr) { + for (i = 1; i < 32 && tstr[i] != 0 && tstr[i] != ','; + i++) + buf[len + i - 1] = tstr[i]; + buf[len + i - 1] = 0; + if (mg_stat(conn, buf, &error_page_file)) { + page_handler_found = 1; + break; + } + tstr = strchr(tstr + i, '.'); + } + } + } + + if (page_handler_found) { + conn->in_error_handler = 1; + handle_file_based_request(conn, buf, &error_page_file); + conn->in_error_handler = 0; + return; + } + } + + /* No custom error page. Send default error page. */ + gmt_time_string(date, sizeof(date), &curtime); + + conn->must_close = 1; + mg_printf(conn, "HTTP/1.1 %d %s\r\n", status, status_text); + send_no_cache_header(conn); + mg_printf(conn, + "Date: %s\r\n" + "Connection: close\r\n\r\n", + date); + + /* Errors 1xx, 204 and 304 MUST NOT send a body */ + if (status > 199 && status != 204 && status != 304) { + + mg_printf(conn, "Error %d: %s\n", status, status_text); + + if (fmt != NULL) { + va_start(ap, fmt); + mg_vsnprintf(conn, NULL, buf, sizeof(buf), fmt, ap); + va_end(ap); + mg_write(conn, buf, strlen(buf)); + DEBUG_TRACE("Error %i - [%s]", status, buf); + } + + } else { + /* No body allowed. Close the connection. */ + DEBUG_TRACE("Error %i", status); + } + } +} + +#if defined(_WIN32) && !defined(__SYMBIAN32__) +/* Create substitutes for POSIX functions in Win32. */ + +#if defined(__MINGW32__) +/* Show no warning in case system functions are not used. */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +#endif + + +static int +pthread_mutex_init(pthread_mutex_t *mutex, void *unused) +{ + (void)unused; + *mutex = CreateMutex(NULL, FALSE, NULL); + return *mutex == NULL ? -1 : 0; +} + + +static int +pthread_mutex_destroy(pthread_mutex_t *mutex) +{ + return CloseHandle(*mutex) == 0 ? -1 : 0; +} + + +static int +pthread_mutex_lock(pthread_mutex_t *mutex) +{ + return WaitForSingleObject(*mutex, INFINITE) == WAIT_OBJECT_0 ? 0 : -1; +} + + +#ifdef ENABLE_UNUSED_PTHREAD_FUNCTIONS +static int +pthread_mutex_trylock(pthread_mutex_t *mutex) +{ + switch (WaitForSingleObject(*mutex, 0)) { + case WAIT_OBJECT_0: + return 0; + case WAIT_TIMEOUT: + return -2; /* EBUSY */ + } + return -1; +} +#endif + + +static int +pthread_mutex_unlock(pthread_mutex_t *mutex) +{ + return ReleaseMutex(*mutex) == 0 ? -1 : 0; +} + + +#ifndef WIN_PTHREADS_TIME_H +static int +clock_gettime(clockid_t clk_id, struct timespec *tp) +{ + FILETIME ft; + ULARGE_INTEGER li; + BOOL ok = FALSE; + double d; + static double perfcnt_per_sec = 0.0; + + if (tp) { + memset(tp, 0, sizeof(*tp)); + if (clk_id == CLOCK_REALTIME) { + GetSystemTimeAsFileTime(&ft); + li.LowPart = ft.dwLowDateTime; + li.HighPart = ft.dwHighDateTime; + li.QuadPart -= 116444736000000000; /* 1.1.1970 in filedate */ + tp->tv_sec = (time_t)(li.QuadPart / 10000000); + tp->tv_nsec = (long)(li.QuadPart % 10000000) * 100; + ok = TRUE; + } else if (clk_id == CLOCK_MONOTONIC) { + if (perfcnt_per_sec == 0.0) { + QueryPerformanceFrequency((LARGE_INTEGER *)&li); + perfcnt_per_sec = 1.0 / li.QuadPart; + } + if (perfcnt_per_sec != 0.0) { + QueryPerformanceCounter((LARGE_INTEGER *)&li); + d = li.QuadPart * perfcnt_per_sec; + tp->tv_sec = (time_t)d; + d -= tp->tv_sec; + tp->tv_nsec = (long)(d * 1.0E9); + ok = TRUE; + } + } + } + + return ok ? 0 : -1; +} +#endif + + +static int +pthread_cond_init(pthread_cond_t *cv, const void *unused) +{ + (void)unused; + InitializeCriticalSection(&cv->threadIdSec); + cv->waitingthreadcount = 0; + cv->waitingthreadhdls = + (pthread_t *)mg_calloc(MAX_WORKER_THREADS, sizeof(pthread_t)); + return (cv->waitingthreadhdls != NULL) ? 0 : -1; +} + + +static int +pthread_cond_timedwait(pthread_cond_t *cv, + pthread_mutex_t *mutex, + const struct timespec *abstime) +{ + struct mg_workerTLS *tls = + (struct mg_workerTLS *)pthread_getspecific(sTlsKey); + int ok; + struct timespec tsnow; + int64_t nsnow, nswaitabs, nswaitrel; + DWORD mswaitrel; + + EnterCriticalSection(&cv->threadIdSec); + assert(cv->waitingthreadcount < MAX_WORKER_THREADS); + cv->waitingthreadhdls[cv->waitingthreadcount] = + tls->pthread_cond_helper_mutex; + cv->waitingthreadcount++; + LeaveCriticalSection(&cv->threadIdSec); + + if (abstime) { + clock_gettime(CLOCK_REALTIME, &tsnow); + nsnow = (((int64_t)tsnow.tv_sec) * 1000000000) + tsnow.tv_nsec; + nswaitabs = + (((int64_t)abstime->tv_sec) * 1000000000) + abstime->tv_nsec; + nswaitrel = nswaitabs - nsnow; + if (nswaitrel < 0) { + nswaitrel = 0; + } + mswaitrel = (DWORD)(nswaitrel / 1000000); + } else { + mswaitrel = INFINITE; + } + + pthread_mutex_unlock(mutex); + ok = (WAIT_OBJECT_0 + == WaitForSingleObject(tls->pthread_cond_helper_mutex, mswaitrel)); + pthread_mutex_lock(mutex); + + return ok ? 0 : -1; +} + + +static int +pthread_cond_wait(pthread_cond_t *cv, pthread_mutex_t *mutex) +{ + return pthread_cond_timedwait(cv, mutex, NULL); +} + + +static int +pthread_cond_signal(pthread_cond_t *cv) +{ + int i; + HANDLE wkup = NULL; + BOOL ok = FALSE; + + EnterCriticalSection(&cv->threadIdSec); + if (cv->waitingthreadcount) { + wkup = cv->waitingthreadhdls[0]; + ok = SetEvent(wkup); + + for (i = 1; i < cv->waitingthreadcount; i++) { + cv->waitingthreadhdls[i - 1] = cv->waitingthreadhdls[i]; + } + cv->waitingthreadcount--; + + assert(ok); + } + LeaveCriticalSection(&cv->threadIdSec); + + return ok ? 0 : 1; +} + + +static int +pthread_cond_broadcast(pthread_cond_t *cv) +{ + EnterCriticalSection(&cv->threadIdSec); + while (cv->waitingthreadcount) { + pthread_cond_signal(cv); + } + LeaveCriticalSection(&cv->threadIdSec); + + return 0; +} + + +static int +pthread_cond_destroy(pthread_cond_t *cv) +{ + EnterCriticalSection(&cv->threadIdSec); + assert(cv->waitingthreadcount == 0); + mg_free(cv->waitingthreadhdls); + cv->waitingthreadhdls = 0; + LeaveCriticalSection(&cv->threadIdSec); + DeleteCriticalSection(&cv->threadIdSec); + + return 0; +} + + +#if defined(__MINGW32__) +/* Enable unused function warning again */ +#pragma GCC diagnostic pop +#endif + + +/* For Windows, change all slashes to backslashes in path names. */ +static void +change_slashes_to_backslashes(char *path) +{ + int i; + + for (i = 0; path[i] != '\0'; i++) { + if (path[i] == '/') { + path[i] = '\\'; + } + + /* remove double backslash (check i > 0 to preserve UNC paths, + * like \\server\file.txt) */ + if ((path[i] == '\\') && (i > 0)) { + while (path[i + 1] == '\\' || path[i + 1] == '/') { + (void)memmove(path + i + 1, path + i + 2, strlen(path + i + 1)); + } + } + } +} + + +static int +mg_wcscasecmp(const wchar_t *s1, const wchar_t *s2) +{ + int diff; + + do { + diff = tolower(*s1) - tolower(*s2); + s1++; + s2++; + } while (diff == 0 && s1[-1] != '\0'); + + return diff; +} + + +/* Encode 'path' which is assumed UTF-8 string, into UNICODE string. + * wbuf and wbuf_len is a target buffer and its length. */ +static void +path_to_unicode(const struct mg_connection *conn, + const char *path, + wchar_t *wbuf, + size_t wbuf_len) +{ + char buf[PATH_MAX], buf2[PATH_MAX]; + wchar_t wbuf2[MAX_PATH + 1]; + DWORD long_len, err; + int (*fcompare)(const wchar_t *, const wchar_t *) = mg_wcscasecmp; + + mg_strlcpy(buf, path, sizeof(buf)); + change_slashes_to_backslashes(buf); + + /* Convert to Unicode and back. If doubly-converted string does not + * match the original, something is fishy, reject. */ + memset(wbuf, 0, wbuf_len * sizeof(wchar_t)); + MultiByteToWideChar(CP_UTF8, 0, buf, -1, wbuf, (int)wbuf_len); + WideCharToMultiByte( + CP_UTF8, 0, wbuf, (int)wbuf_len, buf2, sizeof(buf2), NULL, NULL); + if (strcmp(buf, buf2) != 0) { + wbuf[0] = L'\0'; + } + + /* TODO: Add a configuration to switch between case sensitive and + * case insensitive URIs for Windows server. */ + /* + if (conn) { + if (conn->ctx->config[WINDOWS_CASE_SENSITIVE]) { + fcompare = wcscmp; + } + } + */ + (void)conn; /* conn is currently unused */ + + /* Only accept a full file path, not a Windows short (8.3) path. */ + memset(wbuf2, 0, ARRAY_SIZE(wbuf2) * sizeof(wchar_t)); + long_len = GetLongPathNameW(wbuf, wbuf2, ARRAY_SIZE(wbuf2) - 1); + if (long_len == 0) { + err = GetLastError(); + if (err == ERROR_FILE_NOT_FOUND) { + /* File does not exist. This is not always a problem here. */ + return; + } + } + if ((long_len >= ARRAY_SIZE(wbuf2)) || (fcompare(wbuf, wbuf2) != 0)) { + /* Short name is used. */ + wbuf[0] = L'\0'; + } +} + + +#if defined(_WIN32_WCE) +/* Create substitutes for POSIX functions in Win32. */ + +#if defined(__MINGW32__) +/* Show no warning in case system functions are not used. */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +#endif + + +static time_t +time(time_t *ptime) +{ + time_t t; + SYSTEMTIME st; + FILETIME ft; + + GetSystemTime(&st); + SystemTimeToFileTime(&st, &ft); + t = SYS2UNIX_TIME(ft.dwLowDateTime, ft.dwHighDateTime); + + if (ptime != NULL) { + *ptime = t; + } + + return t; +} + + +static struct tm * +localtime(const time_t *ptime, struct tm *ptm) +{ + int64_t t = ((int64_t)*ptime) * RATE_DIFF + EPOCH_DIFF; + FILETIME ft, lft; + SYSTEMTIME st; + TIME_ZONE_INFORMATION tzinfo; + + if (ptm == NULL) { + return NULL; + } + + *(int64_t *)&ft = t; + FileTimeToLocalFileTime(&ft, &lft); + FileTimeToSystemTime(&lft, &st); + ptm->tm_year = st.wYear - 1900; + ptm->tm_mon = st.wMonth - 1; + ptm->tm_wday = st.wDayOfWeek; + ptm->tm_mday = st.wDay; + ptm->tm_hour = st.wHour; + ptm->tm_min = st.wMinute; + ptm->tm_sec = st.wSecond; + ptm->tm_yday = 0; /* hope nobody uses this */ + ptm->tm_isdst = + GetTimeZoneInformation(&tzinfo) == TIME_ZONE_ID_DAYLIGHT ? 1 : 0; + + return ptm; +} + + +static struct tm * +gmtime(const time_t *ptime, struct tm *ptm) +{ + /* FIXME(lsm): fix this. */ + return localtime(ptime, ptm); +} + + +static size_t +strftime(char *dst, size_t dst_size, const char *fmt, const struct tm *tm) +{ + (void)mg_snprintf(NULL, dst, dst_size, "implement strftime() for WinCE"); + return 0; +} + + +#if defined(__MINGW32__) +/* Enable unused function warning again */ +#pragma GCC diagnostic pop +#endif + +#endif + + +/* Windows happily opens files with some garbage at the end of file name. + * For example, fopen("a.cgi ", "r") on Windows successfully opens + * "a.cgi", despite one would expect an error back. + * This function returns non-0 if path ends with some garbage. */ +static int +path_cannot_disclose_cgi(const char *path) +{ + static const char *allowed_last_characters = "_-"; + int last = path[strlen(path) - 1]; + return isalnum(last) || strchr(allowed_last_characters, last) != NULL; +} + + +static int +mg_stat(struct mg_connection *conn, const char *path, struct file *filep) +{ + wchar_t wbuf[PATH_MAX]; + WIN32_FILE_ATTRIBUTE_DATA info; + time_t creation_time; + + if (!filep) { + return 0; + } + memset(filep, 0, sizeof(*filep)); + + if (conn && is_file_in_memory(conn, path, filep)) { + /* filep->is_directory = 0; filep->gzipped = 0; .. already done by + * memset */ + filep->last_modified = time(NULL); + /* last_modified = now ... assumes the file may change during runtime, + * so every mg_fopen call may return different data */ + /* last_modified = conn->ctx.start_time; + * May be used it the data does not change during runtime. This allows + * browser caching. Since we do not know, we have to assume the file + * in memory may change. */ + return 1; + } + + path_to_unicode(conn, path, wbuf, ARRAY_SIZE(wbuf)); + if (GetFileAttributesExW(wbuf, GetFileExInfoStandard, &info) != 0) { + filep->size = MAKEUQUAD(info.nFileSizeLow, info.nFileSizeHigh); + filep->last_modified = + SYS2UNIX_TIME(info.ftLastWriteTime.dwLowDateTime, + info.ftLastWriteTime.dwHighDateTime); + + /* On Windows, the file creation time can be higher than the + * modification time, e.g. when a file is copied. + * Since the Last-Modified timestamp is used for caching + * it should be based on the most recent timestamp. */ + creation_time = SYS2UNIX_TIME(info.ftCreationTime.dwLowDateTime, + info.ftCreationTime.dwHighDateTime); + if (creation_time > filep->last_modified) { + filep->last_modified = creation_time; + } + + filep->is_directory = info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY; + /* If file name is fishy, reset the file structure and return + * error. + * Note it is important to reset, not just return the error, cause + * functions like is_file_opened() check the struct. */ + if (!filep->is_directory && !path_cannot_disclose_cgi(path)) { + memset(filep, 0, sizeof(*filep)); + return 0; + } + + return 1; + } + + return 0; +} + + +static int +mg_remove(const struct mg_connection *conn, const char *path) +{ + wchar_t wbuf[PATH_MAX]; + path_to_unicode(conn, path, wbuf, ARRAY_SIZE(wbuf)); + return DeleteFileW(wbuf) ? 0 : -1; +} + + +static int +mg_mkdir(const struct mg_connection *conn, const char *path, int mode) +{ + wchar_t wbuf[PATH_MAX]; + (void)mode; + path_to_unicode(conn, path, wbuf, ARRAY_SIZE(wbuf)); + return CreateDirectoryW(wbuf, NULL) ? 0 : -1; +} + + +/* Create substitutes for POSIX functions in Win32. */ + +#if defined(__MINGW32__) +/* Show no warning in case system functions are not used. */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +#endif + + +/* Implementation of POSIX opendir/closedir/readdir for Windows. */ +static DIR * +mg_opendir(const struct mg_connection *conn, const char *name) +{ + DIR *dir = NULL; + wchar_t wpath[PATH_MAX]; + DWORD attrs; + + if (name == NULL) { + SetLastError(ERROR_BAD_ARGUMENTS); + } else if ((dir = (DIR *)mg_malloc(sizeof(*dir))) == NULL) { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + } else { + path_to_unicode(conn, name, wpath, ARRAY_SIZE(wpath)); + attrs = GetFileAttributesW(wpath); + if (attrs != 0xFFFFFFFF && ((attrs & FILE_ATTRIBUTE_DIRECTORY) + == FILE_ATTRIBUTE_DIRECTORY)) { + (void)wcscat(wpath, L"\\*"); + dir->handle = FindFirstFileW(wpath, &dir->info); + dir->result.d_name[0] = '\0'; + } else { + mg_free(dir); + dir = NULL; + } + } + + return dir; +} + + +static int +mg_closedir(DIR *dir) +{ + int result = 0; + + if (dir != NULL) { + if (dir->handle != INVALID_HANDLE_VALUE) + result = FindClose(dir->handle) ? 0 : -1; + + mg_free(dir); + } else { + result = -1; + SetLastError(ERROR_BAD_ARGUMENTS); + } + + return result; +} + + +static struct dirent * +mg_readdir(DIR *dir) +{ + struct dirent *result = 0; + + if (dir) { + if (dir->handle != INVALID_HANDLE_VALUE) { + result = &dir->result; + (void)WideCharToMultiByte(CP_UTF8, + 0, + dir->info.cFileName, + -1, + result->d_name, + sizeof(result->d_name), + NULL, + NULL); + + if (!FindNextFileW(dir->handle, &dir->info)) { + (void)FindClose(dir->handle); + dir->handle = INVALID_HANDLE_VALUE; + } + + } else { + SetLastError(ERROR_FILE_NOT_FOUND); + } + } else { + SetLastError(ERROR_BAD_ARGUMENTS); + } + + return result; +} + + +#ifndef HAVE_POLL +static int +poll(struct pollfd *pfd, unsigned int n, int milliseconds) +{ + struct timeval tv; + fd_set set; + unsigned int i; + int result; + SOCKET maxfd = 0; + + memset(&tv, 0, sizeof(tv)); + tv.tv_sec = milliseconds / 1000; + tv.tv_usec = (milliseconds % 1000) * 1000; + FD_ZERO(&set); + + for (i = 0; i < n; i++) { + FD_SET((SOCKET)pfd[i].fd, &set); + pfd[i].revents = 0; + + if (pfd[i].fd > maxfd) { + maxfd = pfd[i].fd; + } + } + + if ((result = select((int)maxfd + 1, &set, NULL, NULL, &tv)) > 0) { + for (i = 0; i < n; i++) { + if (FD_ISSET(pfd[i].fd, &set)) { + pfd[i].revents = POLLIN; + } + } + } + + return result; +} +#endif /* HAVE_POLL */ + +#if defined(__MINGW32__) +/* Enable unused function warning again */ +#pragma GCC diagnostic pop +#endif + + +static void +set_close_on_exec(SOCKET sock, struct mg_connection *conn /* may be null */) +{ + (void)conn; /* Unused. */ + (void)SetHandleInformation((HANDLE)(intptr_t)sock, HANDLE_FLAG_INHERIT, 0); +} + + +int +mg_start_thread(mg_thread_func_t f, void *p) +{ +#if defined(USE_STACK_SIZE) && (USE_STACK_SIZE > 1) + /* Compile-time option to control stack size, e.g. -DUSE_STACK_SIZE=16384 + */ + return ((_beginthread((void(__cdecl *)(void *))f, USE_STACK_SIZE, p) + == ((uintptr_t)(-1L))) + ? -1 + : 0); +#else + return ( + (_beginthread((void(__cdecl *)(void *))f, 0, p) == ((uintptr_t)(-1L))) + ? -1 + : 0); +#endif /* defined(USE_STACK_SIZE) && (USE_STACK_SIZE > 1) */ +} + + +/* Start a thread storing the thread context. */ +static int +mg_start_thread_with_id(unsigned(__stdcall *f)(void *), + void *p, + pthread_t *threadidptr) +{ + uintptr_t uip; + HANDLE threadhandle; + int result = -1; + + uip = _beginthreadex(NULL, 0, (unsigned(__stdcall *)(void *))f, p, 0, NULL); + threadhandle = (HANDLE)uip; + if ((uip != (uintptr_t)(-1L)) && (threadidptr != NULL)) { + *threadidptr = threadhandle; + result = 0; + } + + return result; +} + + +/* Wait for a thread to finish. */ +static int +mg_join_thread(pthread_t threadid) +{ + int result; + DWORD dwevent; + + result = -1; + dwevent = WaitForSingleObject(threadid, INFINITE); + if (dwevent == WAIT_FAILED) { + DEBUG_TRACE("WaitForSingleObject() failed, error %d", ERRNO); + } else { + if (dwevent == WAIT_OBJECT_0) { + CloseHandle(threadid); + result = 0; + } + } + + return result; +} + +#if !defined(NO_SSL_DL) +/* Create substitutes for POSIX functions in Win32. */ + +#if defined(__MINGW32__) +/* Show no warning in case system functions are not used. */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +#endif + + +static HANDLE +dlopen(const char *dll_name, int flags) +{ + wchar_t wbuf[PATH_MAX]; + (void)flags; + path_to_unicode(NULL, dll_name, wbuf, ARRAY_SIZE(wbuf)); + return LoadLibraryW(wbuf); +} + + +static int +dlclose(void *handle) +{ + int result; + + if (FreeLibrary((HMODULE)handle) != 0) { + result = 0; + } else { + result = -1; + } + + return result; +} + + +#if defined(__MINGW32__) +/* Enable unused function warning again */ +#pragma GCC diagnostic pop +#endif + +#endif + + +#if !defined(NO_CGI) +#define SIGKILL (0) + +static int +kill(pid_t pid, int sig_num) +{ + (void)TerminateProcess((HANDLE)pid, (UINT)sig_num); + (void)CloseHandle((HANDLE)pid); + return 0; +} + + +static void +trim_trailing_whitespaces(char *s) +{ + char *e = s + strlen(s) - 1; + while (e > s && isspace(*(unsigned char *)e)) { + *e-- = '\0'; + } +} + + +static pid_t +spawn_process(struct mg_connection *conn, + const char *prog, + char *envblk, + char *envp[], + int fdin[2], + int fdout[2], + int fderr[2], + const char *dir) +{ + HANDLE me; + char *p, *interp, full_interp[PATH_MAX], full_dir[PATH_MAX], + cmdline[PATH_MAX], buf[PATH_MAX]; + int truncated; + struct file file = STRUCT_FILE_INITIALIZER; + STARTUPINFOA si; + PROCESS_INFORMATION pi = {0}; + + (void)envp; + + memset(&si, 0, sizeof(si)); + si.cb = sizeof(si); + + si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; + si.wShowWindow = SW_HIDE; + + me = GetCurrentProcess(); + DuplicateHandle(me, + (HANDLE)_get_osfhandle(fdin[0]), + me, + &si.hStdInput, + 0, + TRUE, + DUPLICATE_SAME_ACCESS); + DuplicateHandle(me, + (HANDLE)_get_osfhandle(fdout[1]), + me, + &si.hStdOutput, + 0, + TRUE, + DUPLICATE_SAME_ACCESS); + DuplicateHandle(me, + (HANDLE)_get_osfhandle(fderr[1]), + me, + &si.hStdError, + 0, + TRUE, + DUPLICATE_SAME_ACCESS); + + /* Mark handles that should not be inherited. See + * https://msdn.microsoft.com/en-us/library/windows/desktop/ms682499%28v=vs.85%29.aspx + */ + SetHandleInformation((HANDLE)_get_osfhandle(fdin[1]), + HANDLE_FLAG_INHERIT, + 0); + SetHandleInformation((HANDLE)_get_osfhandle(fdout[0]), + HANDLE_FLAG_INHERIT, + 0); + SetHandleInformation((HANDLE)_get_osfhandle(fderr[0]), + HANDLE_FLAG_INHERIT, + 0); + + /* If CGI file is a script, try to read the interpreter line */ + interp = conn->ctx->config[CGI_INTERPRETER]; + if (interp == NULL) { + buf[0] = buf[1] = '\0'; + + /* Read the first line of the script into the buffer */ + mg_snprintf( + conn, &truncated, cmdline, sizeof(cmdline), "%s/%s", dir, prog); + + if (truncated) { + pi.hProcess = (pid_t)-1; + goto spawn_cleanup; + } + + if (mg_fopen(conn, cmdline, "r", &file)) { + p = (char *)file.membuf; + mg_fgets(buf, sizeof(buf), &file, &p); + mg_fclose(&file); + buf[sizeof(buf) - 1] = '\0'; + } + + if (buf[0] == '#' && buf[1] == '!') { + trim_trailing_whitespaces(buf + 2); + } else { + buf[2] = '\0'; + } + interp = buf + 2; + } + + if (interp[0] != '\0') { + GetFullPathNameA(interp, sizeof(full_interp), full_interp, NULL); + interp = full_interp; + } + GetFullPathNameA(dir, sizeof(full_dir), full_dir, NULL); + + if (interp[0] != '\0') { + mg_snprintf(conn, + &truncated, + cmdline, + sizeof(cmdline), + "\"%s\" \"%s\\%s\"", + interp, + full_dir, + prog); + } else { + mg_snprintf(conn, + &truncated, + cmdline, + sizeof(cmdline), + "\"%s\\%s\"", + full_dir, + prog); + } + + if (truncated) { + pi.hProcess = (pid_t)-1; + goto spawn_cleanup; + } + + DEBUG_TRACE("Running [%s]", cmdline); + if (CreateProcessA(NULL, + cmdline, + NULL, + NULL, + TRUE, + CREATE_NEW_PROCESS_GROUP, + envblk, + NULL, + &si, + &pi) == 0) { + mg_cry( + conn, "%s: CreateProcess(%s): %ld", __func__, cmdline, (long)ERRNO); + pi.hProcess = (pid_t)-1; + /* goto spawn_cleanup; */ + } + +spawn_cleanup: + (void)CloseHandle(si.hStdOutput); + (void)CloseHandle(si.hStdError); + (void)CloseHandle(si.hStdInput); + if (pi.hThread != NULL) { + (void)CloseHandle(pi.hThread); + } + + return (pid_t)pi.hProcess; +} +#endif /* !NO_CGI */ + + +static int +set_non_blocking_mode(SOCKET sock) +{ + unsigned long on = 1; + return ioctlsocket(sock, (long)FIONBIO, &on); +} + +#else + +static int +mg_stat(struct mg_connection *conn, const char *path, struct file *filep) +{ + struct stat st; + if (!filep) { + return 0; + } + memset(filep, 0, sizeof(*filep)); + + if (conn && is_file_in_memory(conn, path, filep)) { + return 1; + } + + if (0 == stat(path, &st)) { + filep->size = (uint64_t)(st.st_size); + filep->last_modified = st.st_mtime; + filep->is_directory = S_ISDIR(st.st_mode); + return 1; + } + + return 0; +} + + +static void +set_close_on_exec(SOCKET fd, struct mg_connection *conn /* may be null */) +{ + if (fcntl(fd, F_SETFD, FD_CLOEXEC) != 0) { + if (conn) { + mg_cry(conn, + "%s: fcntl(F_SETFD FD_CLOEXEC) failed: %s", + __func__, + strerror(ERRNO)); + } + } +} + + +int +mg_start_thread(mg_thread_func_t func, void *param) +{ + pthread_t thread_id; + pthread_attr_t attr; + int result; + + (void)pthread_attr_init(&attr); + (void)pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + +#if defined(USE_STACK_SIZE) && (USE_STACK_SIZE > 1) + /* Compile-time option to control stack size, + * e.g. -DUSE_STACK_SIZE=16384 */ + (void)pthread_attr_setstacksize(&attr, USE_STACK_SIZE); +#endif /* defined(USE_STACK_SIZE) && (USE_STACK_SIZE > 1) */ + + result = pthread_create(&thread_id, &attr, func, param); + pthread_attr_destroy(&attr); + + return result; +} + + +/* Start a thread storing the thread context. */ +static int +mg_start_thread_with_id(mg_thread_func_t func, + void *param, + pthread_t *threadidptr) +{ + pthread_t thread_id; + pthread_attr_t attr; + int result; + + (void)pthread_attr_init(&attr); + +#if defined(USE_STACK_SIZE) && (USE_STACK_SIZE > 1) + /* Compile-time option to control stack size, + * e.g. -DUSE_STACK_SIZE=16384 */ + (void)pthread_attr_setstacksize(&attr, USE_STACK_SIZE); +#endif /* defined(USE_STACK_SIZE) && USE_STACK_SIZE > 1 */ + + result = pthread_create(&thread_id, &attr, func, param); + pthread_attr_destroy(&attr); + if ((result == 0) && (threadidptr != NULL)) { + *threadidptr = thread_id; + } + return result; +} + + +/* Wait for a thread to finish. */ +static int +mg_join_thread(pthread_t threadid) +{ + int result; + + result = pthread_join(threadid, NULL); + return result; +} + + +#ifndef NO_CGI +static pid_t +spawn_process(struct mg_connection *conn, + const char *prog, + char *envblk, + char *envp[], + int fdin[2], + int fdout[2], + int fderr[2], + const char *dir) +{ + pid_t pid; + const char *interp; + + (void)envblk; + + if (conn == NULL) { + return 0; + } + + if ((pid = fork()) == -1) { + /* Parent */ + send_http_error(conn, + 500, + "Error: Creating CGI process\nfork(): %s", + strerror(ERRNO)); + } else if (pid == 0) { + /* Child */ + if (chdir(dir) != 0) { + mg_cry(conn, "%s: chdir(%s): %s", __func__, dir, strerror(ERRNO)); + } else if (dup2(fdin[0], 0) == -1) { + mg_cry(conn, + "%s: dup2(%d, 0): %s", + __func__, + fdin[0], + strerror(ERRNO)); + } else if (dup2(fdout[1], 1) == -1) { + mg_cry(conn, + "%s: dup2(%d, 1): %s", + __func__, + fdout[1], + strerror(ERRNO)); + } else if (dup2(fderr[1], 2) == -1) { + mg_cry(conn, + "%s: dup2(%d, 2): %s", + __func__, + fderr[1], + strerror(ERRNO)); + } else { + /* Keep stderr and stdout in two different pipes. + * Stdout will be sent back to the client, + * stderr should go into a server error log. */ + (void)close(fdin[0]); + (void)close(fdout[1]); + (void)close(fderr[1]); + + /* Close write end fdin and read end fdout and fderr */ + (void)close(fdin[1]); + (void)close(fdout[0]); + (void)close(fderr[0]); + + /* After exec, all signal handlers are restored to their default + * values, with one exception of SIGCHLD. According to + * POSIX.1-2001 and Linux's implementation, SIGCHLD's handler will + * leave unchanged after exec if it was set to be ignored. Restore + * it to default action. */ + signal(SIGCHLD, SIG_DFL); + + interp = conn->ctx->config[CGI_INTERPRETER]; + if (interp == NULL) { + (void)execle(prog, prog, NULL, envp); + mg_cry(conn, + "%s: execle(%s): %s", + __func__, + prog, + strerror(ERRNO)); + } else { + (void)execle(interp, interp, prog, NULL, envp); + mg_cry(conn, + "%s: execle(%s %s): %s", + __func__, + interp, + prog, + strerror(ERRNO)); + } + } + exit(EXIT_FAILURE); + } + + return pid; +} +#endif /* !NO_CGI */ + + +static int +set_non_blocking_mode(SOCKET sock) +{ + int flags; + + flags = fcntl(sock, F_GETFL, 0); + (void)fcntl(sock, F_SETFL, flags | O_NONBLOCK); + + return 0; +} +#endif /* _WIN32 */ +/* End of initial operating system specific define block. */ + + +/* Get a random number (independent of C rand function) */ +static uint64_t +get_random(void) +{ + static uint64_t lfsr = 0; /* Linear feedback shift register */ + static uint64_t lcg = 0; /* Linear congruential generator */ + struct timespec now; + + memset(&now, 0, sizeof(now)); + clock_gettime(CLOCK_MONOTONIC, &now); + + if (lfsr == 0) { + /* lfsr will be only 0 if has not been initialized, + * so this code is called only once. */ + lfsr = (((uint64_t)now.tv_sec) << 21) ^ ((uint64_t)now.tv_nsec) + ^ ((uint64_t)(ptrdiff_t)&now) ^ (((uint64_t)time(NULL)) << 33); + lcg = (((uint64_t)now.tv_sec) << 25) + (uint64_t)now.tv_nsec + + (uint64_t)(ptrdiff_t)&now; + } else { + /* Get the next step of both random number generators. */ + lfsr = (lfsr >> 1) + | ((((lfsr >> 0) ^ (lfsr >> 1) ^ (lfsr >> 3) ^ (lfsr >> 4)) & 1) + << 63); + lcg = lcg * 6364136223846793005 + 1442695040888963407; + } + + /* Combining two pseudo-random number generators and a high resolution part + * of the current server time will make it hard (impossible?) to guess the + * next number. */ + return (lfsr ^ lcg ^ (uint64_t)now.tv_nsec); +} + + +/* Write data to the IO channel - opened file descriptor, socket or SSL + * descriptor. Return number of bytes written. */ +static int +push(struct mg_context *ctx, + FILE *fp, + SOCKET sock, + SSL *ssl, + const char *buf, + int len, + double timeout) +{ + struct timespec start, now; + int n, err; + +#ifdef _WIN32 + typedef int len_t; +#else + typedef size_t len_t; +#endif + + if (timeout > 0) { + memset(&start, 0, sizeof(start)); + memset(&now, 0, sizeof(now)); + clock_gettime(CLOCK_MONOTONIC, &start); + } + + if (ctx == NULL) { + return -1; + } + +#ifdef NO_SSL + if (ssl) { + return -1; + } +#endif + + do { + +#ifndef NO_SSL + if (ssl != NULL) { + n = SSL_write(ssl, buf, len); + if (n <= 0) { + err = SSL_get_error(ssl, n); + if ((err == 5 /* SSL_ERROR_SYSCALL */) && (n == -1)) { + err = ERRNO; + } else { + DEBUG_TRACE("SSL_write() failed, error %d", err); + return -1; + } + } else { + err = 0; + } + } else +#endif + if (fp != NULL) { + n = (int)fwrite(buf, 1, (size_t)len, fp); + if (ferror(fp)) { + n = -1; + err = ERRNO; + } else { + err = 0; + } + } else { + n = (int)send(sock, buf, (len_t)len, MSG_NOSIGNAL); + err = (n < 0) ? ERRNO : 0; + } + + if (ctx->stop_flag) { + return -1; + } + + if ((n > 0) || (n == 0 && len == 0)) { + /* some data has been read, or no data was requested */ + return n; + } + if (n == 0) { + /* shutdown of the socket at client side */ + return -1; + } + if (n < 0) { + /* socket error - check errno */ + DEBUG_TRACE("send() failed, error %d", err); + + /* TODO: error handling depending on the error code. + * These codes are different between Windows and Linux. + */ + return -1; + } + + /* This code is not reached in the moment. + * ==> Fix the TODOs above first. */ + + if (timeout > 0) { + clock_gettime(CLOCK_MONOTONIC, &now); + } + + } while ((timeout <= 0) || (mg_difftimespec(&now, &start) <= timeout)); + + (void)err; /* Avoid unused warning if NO_SSL is set and DEBUG_TRACE is not + used */ + + return -1; +} + + +static int64_t +push_all(struct mg_context *ctx, + FILE *fp, + SOCKET sock, + SSL *ssl, + const char *buf, + int64_t len) +{ + double timeout = -1.0; + int64_t n, nwritten = 0; + + if (ctx == NULL) { + return -1; + } + + if (ctx->config[REQUEST_TIMEOUT]) { + timeout = atoi(ctx->config[REQUEST_TIMEOUT]) / 1000.0; + } + + while (len > 0 && ctx->stop_flag == 0) { + n = push(ctx, fp, sock, ssl, buf + nwritten, (int)len, timeout); + if (n < 0) { + if (nwritten == 0) { + nwritten = n; /* Propagate the error */ + } + break; + } else if (n == 0) { + break; /* No more data to write */ + } else { + nwritten += n; + len -= n; + } + } + + return nwritten; +} + + +/* Read from IO channel - opened file descriptor, socket, or SSL descriptor. + * Return negative value on error, or number of bytes read on success. */ +static int +pull(FILE *fp, struct mg_connection *conn, char *buf, int len, double timeout) +{ + int nread, err; + struct timespec start, now; + +#ifdef _WIN32 + typedef int len_t; +#else + typedef size_t len_t; +#endif + + if (timeout > 0) { + memset(&start, 0, sizeof(start)); + memset(&now, 0, sizeof(now)); + clock_gettime(CLOCK_MONOTONIC, &start); + } + + do { + if (fp != NULL) { + /* Use read() instead of fread(), because if we're reading from the + * CGI pipe, fread() may block until IO buffer is filled up. We + * cannot afford to block and must pass all read bytes immediately + * to the client. */ + nread = (int)read(fileno(fp), buf, (size_t)len); + err = (nread < 0) ? ERRNO : 0; + +#ifndef NO_SSL + } else if (conn->ssl != NULL) { + nread = SSL_read(conn->ssl, buf, len); + if (nread <= 0) { + err = SSL_get_error(conn->ssl, nread); + if ((err == 5 /* SSL_ERROR_SYSCALL */) && (nread == -1)) { + err = ERRNO; + } else { + DEBUG_TRACE("SSL_read() failed, error %d", err); + return -1; + } + } else { + err = 0; + } +#endif + + } else { + nread = (int)recv(conn->client.sock, buf, (len_t)len, 0); + err = (nread < 0) ? ERRNO : 0; + } + + if (conn->ctx->stop_flag) { + return -1; + } + + if ((nread > 0) || (nread == 0 && len == 0)) { + /* some data has been read, or no data was requested */ + return nread; + } + if (nread == 0) { + /* shutdown of the socket at client side */ + return -1; + } + if (nread < 0) { +/* socket error - check errno */ +#ifdef _WIN32 + if (err == WSAEWOULDBLOCK) { + /* standard case if called from close_socket_gracefully */ + return -1; + } else if (err == WSAETIMEDOUT) { + /* timeout is handled by the while loop */ + } else { + DEBUG_TRACE("recv() failed, error %d", err); + return -1; + } +#else + /* TODO: POSIX returns either EAGAIN or EWOULDBLOCK in both cases, + * if the timeout is reached and if the socket was set to non- + * blocking in close_socket_gracefully, so we can not distinguish + * here. We have to wait for the timeout in both cases for now. + */ + if (err == EAGAIN || err == EWOULDBLOCK || err == EINTR) { + /* EAGAIN/EWOULDBLOCK: + * standard case if called from close_socket_gracefully + * => should return -1 */ + /* or timeout occured + * => the code must stay in the while loop */ + + /* EINTR can be generated on a socket with a timeout set even + * when SA_RESTART is effective for all relevant signals + * (see signal(7)). + * => stay in the while loop */ + } else { + DEBUG_TRACE("recv() failed, error %d", err); + return -1; + } +#endif + } + if (timeout > 0) { + clock_gettime(CLOCK_MONOTONIC, &now); + } + } while ((timeout <= 0) || (mg_difftimespec(&now, &start) <= timeout)); + + /* Timeout occured, but no data available. */ + return -1; +} + + +static int +pull_all(FILE *fp, struct mg_connection *conn, char *buf, int len) +{ + int n, nread = 0; + double timeout = -1.0; + + if (conn->ctx->config[REQUEST_TIMEOUT]) { + timeout = atoi(conn->ctx->config[REQUEST_TIMEOUT]) / 1000.0; + } + + while (len > 0 && conn->ctx->stop_flag == 0) { + n = pull(fp, conn, buf + nread, len, timeout); + if (n < 0) { + if (nread == 0) { + nread = n; /* Propagate the error */ + } + break; + } else if (n == 0) { + break; /* No more data to read */ + } else { + conn->consumed_content += n; + nread += n; + len -= n; + } + } + + return nread; +} + + +static void +discard_unread_request_data(struct mg_connection *conn) +{ + char buf[MG_BUF_LEN]; + size_t to_read; + int nread; + + if (conn == NULL) { + return; + } + + to_read = sizeof(buf); + + if (conn->is_chunked) { + /* Chunked encoding: 1=chunk not read completely, 2=chunk read + * completely */ + while (conn->is_chunked == 1) { + nread = mg_read(conn, buf, to_read); + if (nread <= 0) { + break; + } + } + + } else { + /* Not chunked: content length is known */ + while (conn->consumed_content < conn->content_len) { + if (to_read + > (size_t)(conn->content_len - conn->consumed_content)) { + to_read = (size_t)(conn->content_len - conn->consumed_content); + } + + nread = mg_read(conn, buf, to_read); + if (nread <= 0) { + break; + } + } + } +} + + +static int +mg_read_inner(struct mg_connection *conn, void *buf, size_t len) +{ + int64_t n, buffered_len, nread; + int64_t len64 = + (int64_t)(len > INT_MAX ? INT_MAX : len); /* since the return value is + * int, we may not read more + * bytes */ + const char *body; + + if (conn == NULL) { + return 0; + } + + /* If Content-Length is not set for a PUT or POST request, read until + * socket is closed */ + if (conn->consumed_content == 0 && conn->content_len == -1) { + conn->content_len = INT64_MAX; + conn->must_close = 1; + } + + nread = 0; + if (conn->consumed_content < conn->content_len) { + /* Adjust number of bytes to read. */ + int64_t left_to_read = conn->content_len - conn->consumed_content; + if (left_to_read < len64) { + /* Do not read more than the total content length of the request. + */ + len64 = left_to_read; + } + + /* Return buffered data */ + buffered_len = (int64_t)(conn->data_len) - (int64_t)conn->request_len + - conn->consumed_content; + if (buffered_len > 0) { + if (len64 < buffered_len) { + buffered_len = len64; + } + body = conn->buf + conn->request_len + conn->consumed_content; + memcpy(buf, body, (size_t)buffered_len); + len64 -= buffered_len; + conn->consumed_content += buffered_len; + nread += buffered_len; + buf = (char *)buf + buffered_len; + } + + /* We have returned all buffered data. Read new data from the remote + * socket. + */ + if ((n = pull_all(NULL, conn, (char *)buf, (int)len64)) >= 0) { + nread += n; + } else { + nread = (nread > 0 ? nread : n); + } + } + return (int)nread; +} + + +static char +mg_getc(struct mg_connection *conn) +{ + char c; + if (conn == NULL) { + return 0; + } + conn->content_len++; + if (mg_read_inner(conn, &c, 1) <= 0) { + return (char)0; + } + return c; +} + + +int +mg_read(struct mg_connection *conn, void *buf, size_t len) +{ + if (len > INT_MAX) { + len = INT_MAX; + } + + if (conn == NULL) { + return 0; + } + + if (conn->is_chunked) { + size_t all_read = 0; + + while (len > 0) { + + if (conn->is_chunked == 2) { + /* No more data left to read */ + return 0; + } + + if (conn->chunk_remainder) { + /* copy from the remainder of the last received chunk */ + long read_ret; + size_t read_now = + ((conn->chunk_remainder > len) ? (len) + : (conn->chunk_remainder)); + + conn->content_len += (int)read_now; + read_ret = + mg_read_inner(conn, (char *)buf + all_read, read_now); + all_read += (size_t)read_ret; + + conn->chunk_remainder -= read_now; + len -= read_now; + + if (conn->chunk_remainder == 0) { + /* the rest of the data in the current chunk has been read + */ + if ((mg_getc(conn) != '\r') || (mg_getc(conn) != '\n')) { + /* Protocol violation */ + return -1; + } + } + + } else { + /* fetch a new chunk */ + int i = 0; + char lenbuf[64]; + char *end = 0; + unsigned long chunkSize = 0; + + for (i = 0; i < ((int)sizeof(lenbuf) - 1); i++) { + lenbuf[i] = mg_getc(conn); + if (i > 0 && lenbuf[i] == '\r' && lenbuf[i - 1] != '\r') { + continue; + } + if (i > 1 && lenbuf[i] == '\n' && lenbuf[i - 1] == '\r') { + lenbuf[i + 1] = 0; + chunkSize = strtoul(lenbuf, &end, 16); + if (chunkSize == 0) { + /* regular end of content */ + conn->is_chunked = 2; + } + break; + } + if (!isalnum(lenbuf[i])) { + /* illegal character for chunk length */ + return -1; + } + } + if ((end == NULL) || (*end != '\r')) { + /* chunksize not set correctly */ + return -1; + } + if (chunkSize == 0) { + break; + } + + conn->chunk_remainder = chunkSize; + } + } + + return (int)all_read; + } + return mg_read_inner(conn, buf, len); +} + + +int +mg_write(struct mg_connection *conn, const void *buf, size_t len) +{ + time_t now; + int64_t n, total, allowed; + + if (conn == NULL) { + return 0; + } + + if (conn->throttle > 0) { + if ((now = time(NULL)) != conn->last_throttle_time) { + conn->last_throttle_time = now; + conn->last_throttle_bytes = 0; + } + allowed = conn->throttle - conn->last_throttle_bytes; + if (allowed > (int64_t)len) { + allowed = (int64_t)len; + } + if ((total = push_all(conn->ctx, + NULL, + conn->client.sock, + conn->ssl, + (const char *)buf, + (int64_t)allowed)) == allowed) { + buf = (const char *)buf + total; + conn->last_throttle_bytes += total; + while (total < (int64_t)len && conn->ctx->stop_flag == 0) { + allowed = conn->throttle > (int64_t)len - total + ? (int64_t)len - total + : conn->throttle; + if ((n = push_all(conn->ctx, + NULL, + conn->client.sock, + conn->ssl, + (const char *)buf, + (int64_t)allowed)) != allowed) { + break; + } + sleep(1); + conn->last_throttle_bytes = allowed; + conn->last_throttle_time = time(NULL); + buf = (const char *)buf + n; + total += n; + } + } + } else { + total = push_all(conn->ctx, + NULL, + conn->client.sock, + conn->ssl, + (const char *)buf, + (int64_t)len); + } + return (int)total; +} + + +/* Alternative alloc_vprintf() for non-compliant C runtimes */ +static int +alloc_vprintf2(char **buf, const char *fmt, va_list ap) +{ + va_list ap_copy; + size_t size = MG_BUF_LEN / 4; + int len = -1; + + *buf = NULL; + while (len < 0) { + if (*buf) { + mg_free(*buf); + } + + size *= 4; + *buf = (char *)mg_malloc(size); + if (!*buf) { + break; + } + + va_copy(ap_copy, ap); + len = vsnprintf_impl(*buf, size - 1, fmt, ap_copy); + va_end(ap_copy); + (*buf)[size - 1] = 0; + } + + return len; +} + + +/* Print message to buffer. If buffer is large enough to hold the message, + * return buffer. If buffer is to small, allocate large enough buffer on heap, + * and return allocated buffer. */ +static int +alloc_vprintf(char **out_buf, + char *prealloc_buf, + size_t prealloc_size, + const char *fmt, + va_list ap) +{ + va_list ap_copy; + int len; + + /* Windows is not standard-compliant, and vsnprintf() returns -1 if + * buffer is too small. Also, older versions of msvcrt.dll do not have + * _vscprintf(). However, if size is 0, vsnprintf() behaves correctly. + * Therefore, we make two passes: on first pass, get required message + * length. + * On second pass, actually print the message. */ + va_copy(ap_copy, ap); + len = vsnprintf_impl(NULL, 0, fmt, ap_copy); + va_end(ap_copy); + + if (len < 0) { + /* C runtime is not standard compliant, vsnprintf() returned -1. + * Switch to alternative code path that uses incremental allocations. + */ + va_copy(ap_copy, ap); + len = alloc_vprintf2(out_buf, fmt, ap); + va_end(ap_copy); + + } else if ((size_t)(len) >= prealloc_size) { + /* The pre-allocated buffer not large enough. */ + /* Allocate a new buffer. */ + *out_buf = (char *)mg_malloc((size_t)(len) + 1); + if (!*out_buf) { + /* Allocation failed. Return -1 as "out of memory" error. */ + return -1; + } + /* Buffer allocation successful. Store the string there. */ + va_copy(ap_copy, ap); + IGNORE_UNUSED_RESULT( + vsnprintf_impl(*out_buf, (size_t)(len) + 1, fmt, ap_copy)); + va_end(ap_copy); + + } else { + /* The pre-allocated buffer is large enough. + * Use it to store the string and return the address. */ + va_copy(ap_copy, ap); + IGNORE_UNUSED_RESULT( + vsnprintf_impl(prealloc_buf, prealloc_size, fmt, ap_copy)); + va_end(ap_copy); + *out_buf = prealloc_buf; + } + + return len; +} + + +static int +mg_vprintf(struct mg_connection *conn, const char *fmt, va_list ap) +{ + char mem[MG_BUF_LEN]; + char *buf = NULL; + int len; + + if ((len = alloc_vprintf(&buf, mem, sizeof(mem), fmt, ap)) > 0) { + len = mg_write(conn, buf, (size_t)len); + } + if (buf != mem && buf != NULL) { + mg_free(buf); + } + + return len; +} + + +int +mg_printf(struct mg_connection *conn, const char *fmt, ...) +{ + va_list ap; + int result; + + va_start(ap, fmt); + result = mg_vprintf(conn, fmt, ap); + va_end(ap); + + return result; +} + + +int +mg_url_decode(const char *src, + int src_len, + char *dst, + int dst_len, + int is_form_url_encoded) +{ + int i, j, a, b; +#define HEXTOI(x) (isdigit(x) ? x - '0' : x - 'W') + + for (i = j = 0; i < src_len && j < dst_len - 1; i++, j++) { + if (i < src_len - 2 && src[i] == '%' + && isxdigit(*(const unsigned char *)(src + i + 1)) + && isxdigit(*(const unsigned char *)(src + i + 2))) { + a = tolower(*(const unsigned char *)(src + i + 1)); + b = tolower(*(const unsigned char *)(src + i + 2)); + dst[j] = (char)((HEXTOI(a) << 4) | HEXTOI(b)); + i += 2; + } else if (is_form_url_encoded && src[i] == '+') { + dst[j] = ' '; + } else { + dst[j] = src[i]; + } + } + + dst[j] = '\0'; /* Null-terminate the destination */ + + return i >= src_len ? j : -1; +} + + +int +mg_get_var(const char *data, + size_t data_len, + const char *name, + char *dst, + size_t dst_len) +{ + return mg_get_var2(data, data_len, name, dst, dst_len, 0); +} + + +int +mg_get_var2(const char *data, + size_t data_len, + const char *name, + char *dst, + size_t dst_len, + size_t occurrence) +{ + const char *p, *e, *s; + size_t name_len; + int len; + + if (dst == NULL || dst_len == 0) { + len = -2; + } else if (data == NULL || name == NULL || data_len == 0) { + len = -1; + dst[0] = '\0'; + } else { + name_len = strlen(name); + e = data + data_len; + len = -1; + dst[0] = '\0'; + + /* data is "var1=val1&var2=val2...". Find variable first */ + for (p = data; p + name_len < e; p++) { + if ((p == data || p[-1] == '&') && p[name_len] == '=' + && !mg_strncasecmp(name, p, name_len) && 0 == occurrence--) { + /* Point p to variable value */ + p += name_len + 1; + + /* Point s to the end of the value */ + s = (const char *)memchr(p, '&', (size_t)(e - p)); + if (s == NULL) { + s = e; + } + /* assert(s >= p); */ + if (s < p) { + return -3; + } + + /* Decode variable into destination buffer */ + len = mg_url_decode(p, (int)(s - p), dst, (int)dst_len, 1); + + /* Redirect error code from -1 to -2 (destination buffer too + * small). */ + if (len == -1) { + len = -2; + } + break; + } + } + } + + return len; +} + + +int +mg_get_cookie(const char *cookie_header, + const char *var_name, + char *dst, + size_t dst_size) +{ + const char *s, *p, *end; + int name_len, len = -1; + + if (dst == NULL || dst_size == 0) { + len = -2; + } else if (var_name == NULL || (s = cookie_header) == NULL) { + len = -1; + dst[0] = '\0'; + } else { + name_len = (int)strlen(var_name); + end = s + strlen(s); + dst[0] = '\0'; + + for (; (s = mg_strcasestr(s, var_name)) != NULL; s += name_len) { + if (s[name_len] == '=') { + s += name_len + 1; + if ((p = strchr(s, ' ')) == NULL) { + p = end; + } + if (p[-1] == ';') { + p--; + } + if (*s == '"' && p[-1] == '"' && p > s + 1) { + s++; + p--; + } + if ((size_t)(p - s) < dst_size) { + len = (int)(p - s); + mg_strlcpy(dst, s, (size_t)len + 1); + } else { + len = -3; + } + break; + } + } + } + return len; +} + + +#if defined(USE_WEBSOCKET) || defined(USE_LUA) +static void +base64_encode(const unsigned char *src, int src_len, char *dst) +{ + static const char *b64 = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + int i, j, a, b, c; + + for (i = j = 0; i < src_len; i += 3) { + a = src[i]; + b = i + 1 >= src_len ? 0 : src[i + 1]; + c = i + 2 >= src_len ? 0 : src[i + 2]; + + dst[j++] = b64[a >> 2]; + dst[j++] = b64[((a & 3) << 4) | (b >> 4)]; + if (i + 1 < src_len) { + dst[j++] = b64[(b & 15) << 2 | (c >> 6)]; + } + if (i + 2 < src_len) { + dst[j++] = b64[c & 63]; + } + } + while (j % 4 != 0) { + dst[j++] = '='; + } + dst[j++] = '\0'; +} +#endif + + +#if defined(USE_LUA) +static unsigned char +b64reverse(char letter) +{ + if (letter >= 'A' && letter <= 'Z') { + return letter - 'A'; + } + if (letter >= 'a' && letter <= 'z') { + return letter - 'a' + 26; + } + if (letter >= '0' && letter <= '9') { + return letter - '0' + 52; + } + if (letter == '+') { + return 62; + } + if (letter == '/') { + return 63; + } + if (letter == '=') { + return 255; /* normal end */ + } + return 254; /* error */ +} + + +static int +base64_decode(const unsigned char *src, int src_len, char *dst, size_t *dst_len) +{ + int i; + unsigned char a, b, c, d; + + *dst_len = 0; + + for (i = 0; i < src_len; i += 4) { + a = b64reverse(src[i]); + if (a >= 254) { + return i; + } + + b = b64reverse(i + 1 >= src_len ? 0 : src[i + 1]); + if (b >= 254) { + return i + 1; + } + + c = b64reverse(i + 2 >= src_len ? 0 : src[i + 2]); + if (c == 254) { + return i + 2; + } + + d = b64reverse(i + 3 >= src_len ? 0 : src[i + 3]); + if (d == 254) { + return i + 3; + } + + dst[(*dst_len)++] = (a << 2) + (b >> 4); + if (c != 255) { + dst[(*dst_len)++] = (b << 4) + (c >> 2); + if (d != 255) { + dst[(*dst_len)++] = (c << 6) + d; + } + } + } + return -1; +} +#endif + + +static int +is_put_or_delete_method(const struct mg_connection *conn) +{ + if (conn) { + const char *s = conn->request_info.request_method; + return s != NULL && (!strcmp(s, "PUT") || !strcmp(s, "DELETE") + || !strcmp(s, "MKCOL") || !strcmp(s, "PATCH")); + } + return 0; +} + + +static void +interpret_uri(struct mg_connection *conn, /* in: request (must be valid) */ + char *filename, /* out: filename */ + size_t filename_buf_len, /* in: size of filename buffer */ + struct file *filep, /* out: file structure */ + int *is_found, /* out: file is found (directly) */ + int *is_script_resource, /* out: handled by a script? */ + int *is_websocket_request, /* out: websocket connetion? */ + int *is_put_or_delete_request /* out: put/delete a file? */ + ) +{ +/* TODO (high): Restructure this function */ + +#if !defined(NO_FILES) + const char *uri = conn->request_info.local_uri; + const char *root = conn->ctx->config[DOCUMENT_ROOT]; + const char *rewrite; + struct vec a, b; + int match_len; + char gz_path[PATH_MAX]; + char const *accept_encoding; + int truncated; +#if !defined(NO_CGI) || defined(USE_LUA) + char *p; +#endif +#else + (void)filename_buf_len; /* unused if NO_FILES is defined */ +#endif + + memset(filep, 0, sizeof(*filep)); + *filename = 0; + *is_found = 0; + *is_script_resource = 0; + *is_put_or_delete_request = is_put_or_delete_method(conn); + +#if defined(USE_WEBSOCKET) + *is_websocket_request = is_websocket_protocol(conn); +#if !defined(NO_FILES) + if (*is_websocket_request && conn->ctx->config[WEBSOCKET_ROOT]) { + root = conn->ctx->config[WEBSOCKET_ROOT]; + } +#endif /* !NO_FILES */ +#else /* USE_WEBSOCKET */ + *is_websocket_request = 0; +#endif /* USE_WEBSOCKET */ + +#if !defined(NO_FILES) + /* Note that root == NULL is a regular use case here. This occurs, + * if all requests are handled by callbacks, so the WEBSOCKET_ROOT + * config is not required. */ + if (root == NULL) { + /* all file related outputs have already been set to 0, just return + */ + return; + } + + /* Using buf_len - 1 because memmove() for PATH_INFO may shift part + * of the path one byte on the right. + * If document_root is NULL, leave the file empty. */ + mg_snprintf( + conn, &truncated, filename, filename_buf_len - 1, "%s%s", root, uri); + + if (truncated) { + goto interpret_cleanup; + } + + rewrite = conn->ctx->config[REWRITE]; + while ((rewrite = next_option(rewrite, &a, &b)) != NULL) { + if ((match_len = match_prefix(a.ptr, a.len, uri)) > 0) { + mg_snprintf(conn, + &truncated, + filename, + filename_buf_len - 1, + "%.*s%s", + (int)b.len, + b.ptr, + uri + match_len); + break; + } + } + + if (truncated) { + goto interpret_cleanup; + } + + /* Local file path and name, corresponding to requested URI + * is now stored in "filename" variable. */ + if (mg_stat(conn, filename, filep)) { +#if !defined(NO_CGI) || defined(USE_LUA) || defined(USE_DUKTAPE) + /* File exists. Check if it is a script type. */ + if (0 +#if !defined(NO_CGI) + || match_prefix(conn->ctx->config[CGI_EXTENSIONS], + strlen(conn->ctx->config[CGI_EXTENSIONS]), + filename) > 0 +#endif +#if defined(USE_LUA) + || match_prefix(conn->ctx->config[LUA_SCRIPT_EXTENSIONS], + strlen(conn->ctx->config[LUA_SCRIPT_EXTENSIONS]), + filename) > 0 +#endif +#if defined(USE_DUKTAPE) + || match_prefix(conn->ctx->config[DUKTAPE_SCRIPT_EXTENSIONS], + strlen( + conn->ctx->config[DUKTAPE_SCRIPT_EXTENSIONS]), + filename) > 0 +#endif + ) { + /* The request addresses a CGI script or a Lua script. The URI + * corresponds to the script itself (like /path/script.cgi), + * and there is no additional resource path + * (like /path/script.cgi/something). + * Requests that modify (replace or delete) a resource, like + * PUT and DELETE requests, should replace/delete the script + * file. + * Requests that read or write from/to a resource, like GET and + * POST requests, should call the script and return the + * generated response. */ + *is_script_resource = !*is_put_or_delete_request; + } +#endif /* !defined(NO_CGI) || defined(USE_LUA) || defined(USE_DUKTAPE) */ + *is_found = 1; + return; + } + + /* If we can't find the actual file, look for the file + * with the same name but a .gz extension. If we find it, + * use that and set the gzipped flag in the file struct + * to indicate that the response need to have the content- + * encoding: gzip header. + * We can only do this if the browser declares support. */ + if ((accept_encoding = mg_get_header(conn, "Accept-Encoding")) != NULL) { + if (strstr(accept_encoding, "gzip") != NULL) { + mg_snprintf( + conn, &truncated, gz_path, sizeof(gz_path), "%s.gz", filename); + + if (truncated) { + goto interpret_cleanup; + } + + if (mg_stat(conn, gz_path, filep)) { + if (filep) { + filep->gzipped = 1; + *is_found = 1; + } + /* Currently gz files can not be scripts. */ + return; + } + } + } + +#if !defined(NO_CGI) || defined(USE_LUA) || defined(USE_DUKTAPE) + /* Support PATH_INFO for CGI scripts. */ + for (p = filename + strlen(filename); p > filename + 1; p--) { + if (*p == '/') { + *p = '\0'; + if ((0 +#if !defined(NO_CGI) + || match_prefix(conn->ctx->config[CGI_EXTENSIONS], + strlen(conn->ctx->config[CGI_EXTENSIONS]), + filename) > 0 +#endif +#if defined(USE_LUA) + || match_prefix(conn->ctx->config[LUA_SCRIPT_EXTENSIONS], + strlen( + conn->ctx->config[LUA_SCRIPT_EXTENSIONS]), + filename) > 0 +#endif +#if defined(USE_DUKTAPE) + || match_prefix( + conn->ctx->config[DUKTAPE_SCRIPT_EXTENSIONS], + strlen(conn->ctx->config[DUKTAPE_SCRIPT_EXTENSIONS]), + filename) > 0 +#endif + ) && mg_stat(conn, filename, filep)) { + /* Shift PATH_INFO block one character right, e.g. + * "/x.cgi/foo/bar\x00" => "/x.cgi\x00/foo/bar\x00" + * conn->path_info is pointing to the local variable "path" + * declared in handle_request(), so PATH_INFO is not valid + * after handle_request returns. */ + conn->path_info = p + 1; + memmove(p + 2, p + 1, strlen(p + 1) + 1); /* +1 is for + * trailing \0 */ + p[1] = '/'; + *is_script_resource = 1; + break; + } else { + *p = '/'; + } + } + } +#endif /* !defined(NO_CGI) || defined(USE_LUA) || defined(USE_DUKTAPE) */ +#endif /* !defined(NO_FILES) */ + return; + +#if !defined(NO_FILES) +/* Reset all outputs */ +interpret_cleanup: + memset(filep, 0, sizeof(*filep)); + *filename = 0; + *is_found = 0; + *is_script_resource = 0; + *is_websocket_request = 0; + *is_put_or_delete_request = 0; +#endif /* !defined(NO_FILES) */ +} + + +/* Check whether full request is buffered. Return: + * -1 if request is malformed + * 0 if request is not yet fully buffered + * >0 actual request length, including last \r\n\r\n */ +static int +get_request_len(const char *buf, int buflen) +{ + const char *s, *e; + int len = 0; + + for (s = buf, e = s + buflen - 1; len <= 0 && s < e; s++) + /* Control characters are not allowed but >=128 is. */ + if (!isprint(*(const unsigned char *)s) && *s != '\r' && *s != '\n' + && *(const unsigned char *)s < 128) { + len = -1; + break; /* [i_a] abort scan as soon as one malformed character is + * found; */ + /* don't let subsequent \r\n\r\n win us over anyhow */ + } else if (s[0] == '\n' && s[1] == '\n') { + len = (int)(s - buf) + 2; + } else if (s[0] == '\n' && &s[1] < e && s[1] == '\r' && s[2] == '\n') { + len = (int)(s - buf) + 3; + } + + return len; +} + + +#if !defined(NO_CACHING) +/* Convert month to the month number. Return -1 on error, or month number */ +static int +get_month_index(const char *s) +{ + size_t i; + + for (i = 0; i < ARRAY_SIZE(month_names); i++) { + if (!strcmp(s, month_names[i])) { + return (int)i; + } + } + + return -1; +} + + +/* Parse UTC date-time string, and return the corresponding time_t value. */ +static time_t +parse_date_string(const char *datetime) +{ + char month_str[32] = {0}; + int second, minute, hour, day, month, year; + time_t result = (time_t)0; + struct tm tm; + + if ((sscanf(datetime, + "%d/%3s/%d %d:%d:%d", + &day, + month_str, + &year, + &hour, + &minute, + &second) == 6) || (sscanf(datetime, + "%d %3s %d %d:%d:%d", + &day, + month_str, + &year, + &hour, + &minute, + &second) == 6) + || (sscanf(datetime, + "%*3s, %d %3s %d %d:%d:%d", + &day, + month_str, + &year, + &hour, + &minute, + &second) == 6) || (sscanf(datetime, + "%d-%3s-%d %d:%d:%d", + &day, + month_str, + &year, + &hour, + &minute, + &second) == 6)) { + month = get_month_index(month_str); + if ((month >= 0) && (year >= 1970)) { + memset(&tm, 0, sizeof(tm)); + tm.tm_year = year - 1900; + tm.tm_mon = month; + tm.tm_mday = day; + tm.tm_hour = hour; + tm.tm_min = minute; + tm.tm_sec = second; + result = timegm(&tm); + } + } + + return result; +} +#endif /* !NO_CACHING */ + + +/* Protect against directory disclosure attack by removing '..', + * excessive '/' and '\' characters */ +static void +remove_double_dots_and_double_slashes(char *s) +{ + char *p = s; + + while (*s != '\0') { + *p++ = *s++; + if (s[-1] == '/' || s[-1] == '\\') { + /* Skip all following slashes, backslashes and double-dots */ + while (s[0] != '\0') { + if (s[0] == '/' || s[0] == '\\') { + s++; + } else if (s[0] == '.' && s[1] == '.') { + s += 2; + } else { + break; + } + } + } + } + *p = '\0'; +} + + +static const struct { + const char *extension; + size_t ext_len; + const char *mime_type; +} builtin_mime_types[] = { + /* IANA registered MIME types (http://www.iana.org/assignments/media-types) + * application types */ + {".doc", 4, "application/msword"}, + {".eps", 4, "application/postscript"}, + {".exe", 4, "application/octet-stream"}, + {".js", 3, "application/javascript"}, + {".json", 5, "application/json"}, + {".pdf", 4, "application/pdf"}, + {".ps", 3, "application/postscript"}, + {".rtf", 4, "application/rtf"}, + {".xhtml", 6, "application/xhtml+xml"}, + {".xsl", 4, "application/xml"}, + {".xslt", 5, "application/xml"}, + + /* fonts */ + {".ttf", 4, "application/font-sfnt"}, + {".cff", 4, "application/font-sfnt"}, + {".otf", 4, "application/font-sfnt"}, + {".aat", 4, "application/font-sfnt"}, + {".sil", 4, "application/font-sfnt"}, + {".pfr", 4, "application/font-tdpfr"}, + {".woff", 5, "application/font-woff"}, + + /* audio */ + {".mp3", 4, "audio/mpeg"}, + {".oga", 4, "audio/ogg"}, + {".ogg", 4, "audio/ogg"}, + + /* image */ + {".gif", 4, "image/gif"}, + {".ief", 4, "image/ief"}, + {".jpeg", 5, "image/jpeg"}, + {".jpg", 4, "image/jpeg"}, + {".jpm", 4, "image/jpm"}, + {".jpx", 4, "image/jpx"}, + {".png", 4, "image/png"}, + {".svg", 4, "image/svg+xml"}, + {".tif", 4, "image/tiff"}, + {".tiff", 5, "image/tiff"}, + + /* model */ + {".wrl", 4, "model/vrml"}, + + /* text */ + {".css", 4, "text/css"}, + {".csv", 4, "text/csv"}, + {".htm", 4, "text/html"}, + {".html", 5, "text/html"}, + {".sgm", 4, "text/sgml"}, + {".shtm", 5, "text/html"}, + {".shtml", 6, "text/html"}, + {".txt", 4, "text/plain"}, + {".xml", 4, "text/xml"}, + + /* video */ + {".mov", 4, "video/quicktime"}, + {".mp4", 4, "video/mp4"}, + {".mpeg", 5, "video/mpeg"}, + {".mpg", 4, "video/mpeg"}, + {".ogv", 4, "video/ogg"}, + {".qt", 3, "video/quicktime"}, + + /* not registered types + * (http://reference.sitepoint.com/html/mime-types-full, + * http://www.hansenb.pdx.edu/DMKB/dict/tutorials/mime_typ.php, ..) */ + {".arj", 4, "application/x-arj-compressed"}, + {".gz", 3, "application/x-gunzip"}, + {".rar", 4, "application/x-arj-compressed"}, + {".swf", 4, "application/x-shockwave-flash"}, + {".tar", 4, "application/x-tar"}, + {".tgz", 4, "application/x-tar-gz"}, + {".torrent", 8, "application/x-bittorrent"}, + {".ppt", 4, "application/x-mspowerpoint"}, + {".xls", 4, "application/x-msexcel"}, + {".zip", 4, "application/x-zip-compressed"}, + {".aac", + 4, + "audio/aac"}, /* http://en.wikipedia.org/wiki/Advanced_Audio_Coding */ + {".aif", 4, "audio/x-aif"}, + {".m3u", 4, "audio/x-mpegurl"}, + {".mid", 4, "audio/x-midi"}, + {".ra", 3, "audio/x-pn-realaudio"}, + {".ram", 4, "audio/x-pn-realaudio"}, + {".wav", 4, "audio/x-wav"}, + {".bmp", 4, "image/bmp"}, + {".ico", 4, "image/x-icon"}, + {".pct", 4, "image/x-pct"}, + {".pict", 5, "image/pict"}, + {".rgb", 4, "image/x-rgb"}, + {".webm", 5, "video/webm"}, /* http://en.wikipedia.org/wiki/WebM */ + {".asf", 4, "video/x-ms-asf"}, + {".avi", 4, "video/x-msvideo"}, + {".m4v", 4, "video/x-m4v"}, + {NULL, 0, NULL}}; + + +const char * +mg_get_builtin_mime_type(const char *path) +{ + const char *ext; + size_t i, path_len; + + path_len = strlen(path); + + for (i = 0; builtin_mime_types[i].extension != NULL; i++) { + ext = path + (path_len - builtin_mime_types[i].ext_len); + if (path_len > builtin_mime_types[i].ext_len + && mg_strcasecmp(ext, builtin_mime_types[i].extension) == 0) { + return builtin_mime_types[i].mime_type; + } + } + + return "text/plain"; +} + + +/* Look at the "path" extension and figure what mime type it has. + * Store mime type in the vector. */ +static void +get_mime_type(struct mg_context *ctx, const char *path, struct vec *vec) +{ + struct vec ext_vec, mime_vec; + const char *list, *ext; + size_t path_len; + + path_len = strlen(path); + + if (ctx == NULL || vec == NULL) { + return; + } + + /* Scan user-defined mime types first, in case user wants to + * override default mime types. */ + list = ctx->config[EXTRA_MIME_TYPES]; + while ((list = next_option(list, &ext_vec, &mime_vec)) != NULL) { + /* ext now points to the path suffix */ + ext = path + path_len - ext_vec.len; + if (mg_strncasecmp(ext, ext_vec.ptr, ext_vec.len) == 0) { + *vec = mime_vec; + return; + } + } + + vec->ptr = mg_get_builtin_mime_type(path); + vec->len = strlen(vec->ptr); +} + + +/* Stringify binary data. Output buffer must be twice as big as input, + * because each byte takes 2 bytes in string representation */ +static void +bin2str(char *to, const unsigned char *p, size_t len) +{ + static const char *hex = "0123456789abcdef"; + + for (; len--; p++) { + *to++ = hex[p[0] >> 4]; + *to++ = hex[p[0] & 0x0f]; + } + *to = '\0'; +} + + +/* Return stringified MD5 hash for list of strings. Buffer must be 33 bytes. */ +char * +mg_md5(char buf[33], ...) +{ + md5_byte_t hash[16]; + const char *p; + va_list ap; + md5_state_t ctx; + + md5_init(&ctx); + + va_start(ap, buf); + while ((p = va_arg(ap, const char *)) != NULL) { + md5_append(&ctx, (const md5_byte_t *)p, strlen(p)); + } + va_end(ap); + + md5_finish(&ctx, hash); + bin2str(buf, hash, sizeof(hash)); + return buf; +} + + +/* Check the user's password, return 1 if OK */ +static int +check_password(const char *method, + const char *ha1, + const char *uri, + const char *nonce, + const char *nc, + const char *cnonce, + const char *qop, + const char *response) +{ + char ha2[32 + 1], expected_response[32 + 1]; + + /* Some of the parameters may be NULL */ + if (method == NULL || nonce == NULL || nc == NULL || cnonce == NULL + || qop == NULL + || response == NULL) { + return 0; + } + + /* NOTE(lsm): due to a bug in MSIE, we do not compare the URI */ + if (strlen(response) != 32) { + return 0; + } + + mg_md5(ha2, method, ":", uri, NULL); + mg_md5(expected_response, + ha1, + ":", + nonce, + ":", + nc, + ":", + cnonce, + ":", + qop, + ":", + ha2, + NULL); + + return mg_strcasecmp(response, expected_response) == 0; +} + + +/* Use the global passwords file, if specified by auth_gpass option, + * or search for .htpasswd in the requested directory. */ +static void +open_auth_file(struct mg_connection *conn, const char *path, struct file *filep) +{ + if (conn != NULL && conn->ctx != NULL) { + char name[PATH_MAX]; + const char *p, *e, *gpass = conn->ctx->config[GLOBAL_PASSWORDS_FILE]; + struct file file = STRUCT_FILE_INITIALIZER; + int truncated; + + if (gpass != NULL) { + /* Use global passwords file */ + if (!mg_fopen(conn, gpass, "r", filep)) { +#ifdef DEBUG + mg_cry(conn, "fopen(%s): %s", gpass, strerror(ERRNO)); +#endif + } + /* Important: using local struct file to test path for is_directory + * flag. If filep is used, mg_stat() makes it appear as if auth file + * was opened. */ + } else if (mg_stat(conn, path, &file) && file.is_directory) { + mg_snprintf(conn, + &truncated, + name, + sizeof(name), + "%s/%s", + path, + PASSWORDS_FILE_NAME); + + if (truncated || !mg_fopen(conn, name, "r", filep)) { +#ifdef DEBUG + mg_cry(conn, "fopen(%s): %s", name, strerror(ERRNO)); +#endif + } + } else { + /* Try to find .htpasswd in requested directory. */ + for (p = path, e = p + strlen(p) - 1; e > p; e--) { + if (e[0] == '/') { + break; + } + } + mg_snprintf(conn, + &truncated, + name, + sizeof(name), + "%.*s/%s", + (int)(e - p), + p, + PASSWORDS_FILE_NAME); + + if (truncated || !mg_fopen(conn, name, "r", filep)) { +#ifdef DEBUG + mg_cry(conn, "fopen(%s): %s", name, strerror(ERRNO)); +#endif + } + } + } +} + + +/* Parsed Authorization header */ +struct ah { + char *user, *uri, *cnonce, *response, *qop, *nc, *nonce; +}; + + +/* Return 1 on success. Always initializes the ah structure. */ +static int +parse_auth_header(struct mg_connection *conn, + char *buf, + size_t buf_size, + struct ah *ah) +{ + char *name, *value, *s; + const char *auth_header; + uint64_t nonce; + + if (!ah || !conn) { + return 0; + } + + (void)memset(ah, 0, sizeof(*ah)); + if ((auth_header = mg_get_header(conn, "Authorization")) == NULL + || mg_strncasecmp(auth_header, "Digest ", 7) != 0) { + return 0; + } + + /* Make modifiable copy of the auth header */ + (void)mg_strlcpy(buf, auth_header + 7, buf_size); + s = buf; + + /* Parse authorization header */ + for (;;) { + /* Gobble initial spaces */ + while (isspace(*(unsigned char *)s)) { + s++; + } + name = skip_quoted(&s, "=", " ", 0); + /* Value is either quote-delimited, or ends at first comma or space. */ + if (s[0] == '\"') { + s++; + value = skip_quoted(&s, "\"", " ", '\\'); + if (s[0] == ',') { + s++; + } + } else { + value = skip_quoted(&s, ", ", " ", 0); /* IE uses commas, FF uses + * spaces */ + } + if (*name == '\0') { + break; + } + + if (!strcmp(name, "username")) { + ah->user = value; + } else if (!strcmp(name, "cnonce")) { + ah->cnonce = value; + } else if (!strcmp(name, "response")) { + ah->response = value; + } else if (!strcmp(name, "uri")) { + ah->uri = value; + } else if (!strcmp(name, "qop")) { + ah->qop = value; + } else if (!strcmp(name, "nc")) { + ah->nc = value; + } else if (!strcmp(name, "nonce")) { + ah->nonce = value; + } + } + +#ifndef NO_NONCE_CHECK + /* Read the nonce from the response. */ + if (ah->nonce == NULL) { + return 0; + } + s = NULL; + nonce = strtoull(ah->nonce, &s, 10); + if ((s == NULL) || (*s != 0)) { + return 0; + } + + /* Convert the nonce from the client to a number. */ + nonce ^= conn->ctx->auth_nonce_mask; + + /* The converted number corresponds to the time the nounce has been + * created. This should not be earlier than the server start. */ + /* Server side nonce check is valuable in all situations but one: + * if the server restarts frequently, but the client should not see + * that, so the server should accept nonces from previous starts. */ + /* However, the reasonable default is to not accept a nonce from a + * previous start, so if anyone changed the access rights between + * two restarts, a new login is required. */ + if (nonce < (uint64_t)conn->ctx->start_time) { + /* nonce is from a previous start of the server and no longer valid + * (replay attack?) */ + return 0; + } + /* Check if the nonce is too high, so it has not (yet) been used by the + * server. */ + if (nonce >= ((uint64_t)conn->ctx->start_time + conn->ctx->nonce_count)) { + return 0; + } +#endif + + /* CGI needs it as REMOTE_USER */ + if (ah->user != NULL) { + conn->request_info.remote_user = mg_strdup(ah->user); + } else { + return 0; + } + + return 1; +} + + +static const char * +mg_fgets(char *buf, size_t size, struct file *filep, char **p) +{ + const char *eof; + size_t len; + const char *memend; + + if (!filep) { + return NULL; + } + + if (filep->membuf != NULL && *p != NULL) { + memend = (const char *)&filep->membuf[filep->size]; + /* Search for \n from p till the end of stream */ + eof = (char *)memchr(*p, '\n', (size_t)(memend - *p)); + if (eof != NULL) { + eof += 1; /* Include \n */ + } else { + eof = memend; /* Copy remaining data */ + } + len = (size_t)(eof - *p) > size - 1 ? size - 1 : (size_t)(eof - *p); + memcpy(buf, *p, len); + buf[len] = '\0'; + *p += len; + return len ? eof : NULL; + } else if (filep->fp != NULL) { + return fgets(buf, (int)size, filep->fp); + } else { + return NULL; + } +} + +struct read_auth_file_struct { + struct mg_connection *conn; + struct ah ah; + char *domain; + char buf[256 + 256 + 40]; + char *f_user; + char *f_domain; + char *f_ha1; +}; + + +static int +read_auth_file(struct file *filep, struct read_auth_file_struct *workdata) +{ + char *p; + int is_authorized = 0; + struct file fp; + size_t l; + + if (!filep || !workdata) { + return 0; + } + + /* Loop over passwords file */ + p = (char *)filep->membuf; + while (mg_fgets(workdata->buf, sizeof(workdata->buf), filep, &p) != NULL) { + l = strlen(workdata->buf); + while (l > 0) { + if (isspace(workdata->buf[l - 1]) + || iscntrl(workdata->buf[l - 1])) { + l--; + workdata->buf[l] = 0; + } else + break; + } + if (l < 1) { + continue; + } + + workdata->f_user = workdata->buf; + + if (workdata->f_user[0] == ':') { + /* user names may not contain a ':' and may not be empty, + * so lines starting with ':' may be used for a special purpose */ + if (workdata->f_user[1] == '#') { + /* :# is a comment */ + continue; + } else if (!strncmp(workdata->f_user + 1, "include=", 8)) { + if (mg_fopen(workdata->conn, workdata->f_user + 9, "r", &fp)) { + is_authorized = read_auth_file(&fp, workdata); + mg_fclose(&fp); + } else { + mg_cry(workdata->conn, + "%s: cannot open authorization file: %s", + __func__, + workdata->buf); + } + continue; + } + /* everything is invalid for the moment (might change in the + * future) */ + mg_cry(workdata->conn, + "%s: syntax error in authorization file: %s", + __func__, + workdata->buf); + continue; + } + + workdata->f_domain = strchr(workdata->f_user, ':'); + if (workdata->f_domain == NULL) { + mg_cry(workdata->conn, + "%s: syntax error in authorization file: %s", + __func__, + workdata->buf); + continue; + } + *(workdata->f_domain) = 0; + (workdata->f_domain)++; + + workdata->f_ha1 = strchr(workdata->f_domain, ':'); + if (workdata->f_ha1 == NULL) { + mg_cry(workdata->conn, + "%s: syntax error in authorization file: %s", + __func__, + workdata->buf); + continue; + } + *(workdata->f_ha1) = 0; + (workdata->f_ha1)++; + + if (!strcmp(workdata->ah.user, workdata->f_user) + && !strcmp(workdata->domain, workdata->f_domain)) { + return check_password(workdata->conn->request_info.request_method, + workdata->f_ha1, + workdata->ah.uri, + workdata->ah.nonce, + workdata->ah.nc, + workdata->ah.cnonce, + workdata->ah.qop, + workdata->ah.response); + } + } + + return is_authorized; +} + + +/* Authorize against the opened passwords file. Return 1 if authorized. */ +static int +authorize(struct mg_connection *conn, struct file *filep) +{ + struct read_auth_file_struct workdata; + char buf[MG_BUF_LEN]; + + if (!conn || !conn->ctx) { + return 0; + } + + memset(&workdata, 0, sizeof(workdata)); + workdata.conn = conn; + + if (!parse_auth_header(conn, buf, sizeof(buf), &workdata.ah)) { + return 0; + } + workdata.domain = conn->ctx->config[AUTHENTICATION_DOMAIN]; + + return read_auth_file(filep, &workdata); +} + + +/* Return 1 if request is authorised, 0 otherwise. */ +static int +check_authorization(struct mg_connection *conn, const char *path) +{ + char fname[PATH_MAX]; + struct vec uri_vec, filename_vec; + const char *list; + struct file file = STRUCT_FILE_INITIALIZER; + int authorized = 1, truncated; + + if (!conn || !conn->ctx) { + return 0; + } + + list = conn->ctx->config[PROTECT_URI]; + while ((list = next_option(list, &uri_vec, &filename_vec)) != NULL) { + if (!memcmp(conn->request_info.local_uri, uri_vec.ptr, uri_vec.len)) { + mg_snprintf(conn, + &truncated, + fname, + sizeof(fname), + "%.*s", + (int)filename_vec.len, + filename_vec.ptr); + + if (truncated || !mg_fopen(conn, fname, "r", &file)) { + mg_cry(conn, + "%s: cannot open %s: %s", + __func__, + fname, + strerror(errno)); + } + break; + } + } + + if (!is_file_opened(&file)) { + open_auth_file(conn, path, &file); + } + + if (is_file_opened(&file)) { + authorized = authorize(conn, &file); + mg_fclose(&file); + } + + return authorized; +} + + +static void +send_authorization_request(struct mg_connection *conn) +{ + char date[64]; + time_t curtime = time(NULL); + + if (conn && conn->ctx) { + uint64_t nonce = (uint64_t)(conn->ctx->start_time); + + (void)pthread_mutex_lock(&conn->ctx->nonce_mutex); + nonce += conn->ctx->nonce_count; + ++conn->ctx->nonce_count; + (void)pthread_mutex_unlock(&conn->ctx->nonce_mutex); + + nonce ^= conn->ctx->auth_nonce_mask; + conn->status_code = 401; + conn->must_close = 1; + + gmt_time_string(date, sizeof(date), &curtime); + + mg_printf(conn, "HTTP/1.1 401 Unauthorized\r\n"); + send_no_cache_header(conn); + mg_printf(conn, + "Date: %s\r\n" + "Connection: %s\r\n" + "Content-Length: 0\r\n" + "WWW-Authenticate: Digest qop=\"auth\", realm=\"%s\", " + "nonce=\"%" UINT64_FMT "\"\r\n\r\n", + date, + suggest_connection_header(conn), + conn->ctx->config[AUTHENTICATION_DOMAIN], + nonce); + } +} + + +#if !defined(NO_FILES) +static int +is_authorized_for_put(struct mg_connection *conn) +{ + if (conn) { + struct file file = STRUCT_FILE_INITIALIZER; + const char *passfile = conn->ctx->config[PUT_DELETE_PASSWORDS_FILE]; + int ret = 0; + + if (passfile != NULL && mg_fopen(conn, passfile, "r", &file)) { + ret = authorize(conn, &file); + mg_fclose(&file); + } + + return ret; + } + return 0; +} +#endif + + +int +mg_modify_passwords_file(const char *fname, + const char *domain, + const char *user, + const char *pass) +{ + int found, i; + char line[512], u[512] = "", d[512] = "", ha1[33], tmp[PATH_MAX + 8]; + FILE *fp, *fp2; + + found = 0; + fp = fp2 = NULL; + + /* Regard empty password as no password - remove user record. */ + if (pass != NULL && pass[0] == '\0') { + pass = NULL; + } + + /* Other arguments must not be empty */ + if (fname == NULL || domain == NULL || user == NULL) { + return 0; + } + + /* Using the given file format, user name and domain must not contain ':' + */ + if (strchr(user, ':') != NULL) { + return 0; + } + if (strchr(domain, ':') != NULL) { + return 0; + } + + /* Do not allow control characters like newline in user name and domain. + * Do not allow excessively long names either. */ + for (i = 0; i < 255 && user[i] != 0; i++) { + if (iscntrl(user[i])) { + return 0; + } + } + if (user[i]) { + return 0; + } + for (i = 0; i < 255 && domain[i] != 0; i++) { + if (iscntrl(domain[i])) { + return 0; + } + } + if (domain[i]) { + return 0; + } + + /* The maximum length of the path to the password file is limited */ + if ((strlen(fname) + 4) >= PATH_MAX) { + return 0; + } + + /* Create a temporary file name. Length has been checked before. */ + strcpy(tmp, fname); + strcat(tmp, ".tmp"); + + /* Create the file if does not exist */ + /* Use of fopen here is OK, since fname is only ASCII */ + if ((fp = fopen(fname, "a+")) != NULL) { + (void)fclose(fp); + } + + /* Open the given file and temporary file */ + if ((fp = fopen(fname, "r")) == NULL) { + return 0; + } else if ((fp2 = fopen(tmp, "w+")) == NULL) { + fclose(fp); + return 0; + } + + /* Copy the stuff to temporary file */ + while (fgets(line, sizeof(line), fp) != NULL) { + if (sscanf(line, "%255[^:]:%255[^:]:%*s", u, d) != 2) { + continue; + } + u[255] = 0; + d[255] = 0; + + if (!strcmp(u, user) && !strcmp(d, domain)) { + found++; + if (pass != NULL) { + mg_md5(ha1, user, ":", domain, ":", pass, NULL); + fprintf(fp2, "%s:%s:%s\n", user, domain, ha1); + } + } else { + fprintf(fp2, "%s", line); + } + } + + /* If new user, just add it */ + if (!found && pass != NULL) { + mg_md5(ha1, user, ":", domain, ":", pass, NULL); + fprintf(fp2, "%s:%s:%s\n", user, domain, ha1); + } + + /* Close files */ + fclose(fp); + fclose(fp2); + + /* Put the temp file in place of real file */ + IGNORE_UNUSED_RESULT(remove(fname)); + IGNORE_UNUSED_RESULT(rename(tmp, fname)); + + return 1; +} + + +static int +is_valid_port(unsigned long port) +{ + return port < 0xffff; +} + + +static int +mg_inet_pton(int af, const char *src, void *dst, size_t dstlen) +{ + struct addrinfo hints, *res, *ressave; + int func_ret = 0; + int gai_ret; + + memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_family = af; + + gai_ret = getaddrinfo(src, NULL, &hints, &res); + if (gai_ret != 0) { + /* gai_strerror could be used to convert gai_ret to a string */ + /* POSIX return values: see + * http://pubs.opengroup.org/onlinepubs/9699919799/functions/freeaddrinfo.html + */ + /* Windows return values: see + * https://msdn.microsoft.com/en-us/library/windows/desktop/ms738520%28v=vs.85%29.aspx + */ + return 0; + } + + ressave = res; + + while (res) { + if (dstlen >= res->ai_addrlen) { + memcpy(dst, res->ai_addr, res->ai_addrlen); + func_ret = 1; + } + res = res->ai_next; + } + + freeaddrinfo(ressave); + return func_ret; +} + + +static int +connect_socket(struct mg_context *ctx /* may be NULL */, + const char *host, + int port, + int use_ssl, + char *ebuf, + size_t ebuf_len, + SOCKET *sock /* output: socket, must not be NULL */, + union usa *sa /* output: socket address, must not be NULL */ + ) +{ + int ip_ver = 0; + *sock = INVALID_SOCKET; + memset(sa, 0, sizeof(*sa)); + + if (ebuf_len > 0) { + *ebuf = 0; + } + + if (host == NULL) { + mg_snprintf(NULL, + NULL, /* No truncation check for ebuf */ + ebuf, + ebuf_len, + "%s", + "NULL host"); + return 0; + } + + if (port < 0 || !is_valid_port((unsigned)port)) { + mg_snprintf(NULL, + NULL, /* No truncation check for ebuf */ + ebuf, + ebuf_len, + "%s", + "invalid port"); + return 0; + } + + if (use_ssl && (SSLv23_client_method == NULL)) { + mg_snprintf(NULL, + NULL, /* No truncation check for ebuf */ + ebuf, + ebuf_len, + "%s", + "SSL is not initialized"); + return 0; + } + + if (mg_inet_pton(AF_INET, host, &sa->sin, sizeof(sa->sin))) { + sa->sin.sin_port = htons((uint16_t)port); + ip_ver = 4; +#ifdef USE_IPV6 + } else if (mg_inet_pton(AF_INET6, host, &sa->sin6, sizeof(sa->sin6))) { + sa->sin6.sin6_port = htons((uint16_t)port); + ip_ver = 6; + } else if (host[0] == '[') { + /* While getaddrinfo on Windows will work with [::1], + * getaddrinfo on Linux only works with ::1 (without []). */ + size_t l = strlen(host + 1); + char *h = l > 1 ? mg_strdup(host + 1) : NULL; + if (h) { + h[l - 1] = 0; + if (mg_inet_pton(AF_INET6, h, &sa->sin6, sizeof(sa->sin6))) { + sa->sin6.sin6_port = htons((uint16_t)port); + ip_ver = 6; + } + mg_free(h); + } +#endif + } + + if (ip_ver == 0) { + mg_snprintf(NULL, + NULL, /* No truncation check for ebuf */ + ebuf, + ebuf_len, + "%s", + "host not found"); + return 0; + } + + if (ip_ver == 4) { + *sock = socket(PF_INET, SOCK_STREAM, 0); + } +#ifdef USE_IPV6 + else if (ip_ver == 6) { + *sock = socket(PF_INET6, SOCK_STREAM, 0); + } +#endif + + if (*sock == INVALID_SOCKET) { + mg_snprintf(NULL, + NULL, /* No truncation check for ebuf */ + ebuf, + ebuf_len, + "socket(): %s", + strerror(ERRNO)); + return 0; + } + + set_close_on_exec(*sock, fc(ctx)); + + if ((ip_ver == 4) + && (connect(*sock, (struct sockaddr *)&sa->sin, sizeof(sa->sin)) + == 0)) { + /* connected with IPv4 */ + return 1; + } + +#ifdef USE_IPV6 + if ((ip_ver == 6) + && (connect(*sock, (struct sockaddr *)&sa->sin6, sizeof(sa->sin6)) + == 0)) { + /* connected with IPv6 */ + return 1; + } +#endif + + /* Not connected */ + mg_snprintf(NULL, + NULL, /* No truncation check for ebuf */ + ebuf, + ebuf_len, + "connect(%s:%d): %s", + host, + port, + strerror(ERRNO)); + closesocket(*sock); + *sock = INVALID_SOCKET; + return 0; +} + + +int +mg_url_encode(const char *src, char *dst, size_t dst_len) +{ + static const char *dont_escape = "._-$,;~()"; + static const char *hex = "0123456789abcdef"; + char *pos = dst; + const char *end = dst + dst_len - 1; + + for (; *src != '\0' && pos < end; src++, pos++) { + if (isalnum(*(const unsigned char *)src) + || strchr(dont_escape, *(const unsigned char *)src) != NULL) { + *pos = *src; + } else if (pos + 2 < end) { + pos[0] = '%'; + pos[1] = hex[(*(const unsigned char *)src) >> 4]; + pos[2] = hex[(*(const unsigned char *)src) & 0xf]; + pos += 2; + } else { + break; + } + } + + *pos = '\0'; + return (*src == '\0') ? (int)(pos - dst) : -1; +} + + +static void +print_dir_entry(struct de *de) +{ + char size[64], mod[64], href[PATH_MAX]; + struct tm *tm; + + if (de->file.is_directory) { + mg_snprintf(de->conn, + NULL, /* Buffer is big enough */ + size, + sizeof(size), + "%s", + "[DIRECTORY]"); + } else { + /* We use (signed) cast below because MSVC 6 compiler cannot + * convert unsigned __int64 to double. Sigh. */ + if (de->file.size < 1024) { + mg_snprintf(de->conn, + NULL, /* Buffer is big enough */ + size, + sizeof(size), + "%d", + (int)de->file.size); + } else if (de->file.size < 0x100000) { + mg_snprintf(de->conn, + NULL, /* Buffer is big enough */ + size, + sizeof(size), + "%.1fk", + (double)de->file.size / 1024.0); + } else if (de->file.size < 0x40000000) { + mg_snprintf(de->conn, + NULL, /* Buffer is big enough */ + size, + sizeof(size), + "%.1fM", + (double)de->file.size / 1048576); + } else { + mg_snprintf(de->conn, + NULL, /* Buffer is big enough */ + size, + sizeof(size), + "%.1fG", + (double)de->file.size / 1073741824); + } + } + + /* Note: mg_snprintf will not cause a buffer overflow above. + * So, string truncation checks are not required here. */ + + tm = localtime(&de->file.last_modified); + if (tm != NULL) { + strftime(mod, sizeof(mod), "%d-%b-%Y %H:%M", tm); + } else { + mg_strlcpy(mod, "01-Jan-1970 00:00", sizeof(mod)); + mod[sizeof(mod) - 1] = '\0'; + } + mg_url_encode(de->file_name, href, sizeof(href)); + de->conn->num_bytes_sent += + mg_printf(de->conn, + "%s%s" + " %s  %s\n", + de->conn->request_info.local_uri, + href, + de->file.is_directory ? "/" : "", + de->file_name, + de->file.is_directory ? "/" : "", + mod, + size); +} + + +/* This function is called from send_directory() and used for + * sorting directory entries by size, or name, or modification time. + * On windows, __cdecl specification is needed in case if project is built + * with __stdcall convention. qsort always requires __cdels callback. */ +static int WINCDECL +compare_dir_entries(const void *p1, const void *p2) +{ + if (p1 && p2) { + const struct de *a = (const struct de *)p1, *b = (const struct de *)p2; + const char *query_string = a->conn->request_info.query_string; + int cmp_result = 0; + + if (query_string == NULL) { + query_string = "na"; + } + + if (a->file.is_directory && !b->file.is_directory) { + return -1; /* Always put directories on top */ + } else if (!a->file.is_directory && b->file.is_directory) { + return 1; /* Always put directories on top */ + } else if (*query_string == 'n') { + cmp_result = strcmp(a->file_name, b->file_name); + } else if (*query_string == 's') { + cmp_result = a->file.size == b->file.size + ? 0 + : a->file.size > b->file.size ? 1 : -1; + } else if (*query_string == 'd') { + cmp_result = + (a->file.last_modified == b->file.last_modified) + ? 0 + : ((a->file.last_modified > b->file.last_modified) ? 1 + : -1); + } + + return query_string[1] == 'd' ? -cmp_result : cmp_result; + } + return 0; +} + + +static int +must_hide_file(struct mg_connection *conn, const char *path) +{ + if (conn && conn->ctx) { + const char *pw_pattern = "**" PASSWORDS_FILE_NAME "$"; + const char *pattern = conn->ctx->config[HIDE_FILES]; + return match_prefix(pw_pattern, strlen(pw_pattern), path) > 0 + || (pattern != NULL + && match_prefix(pattern, strlen(pattern), path) > 0); + } + return 0; +} + + +static int +scan_directory(struct mg_connection *conn, + const char *dir, + void *data, + void (*cb)(struct de *, void *)) +{ + char path[PATH_MAX]; + struct dirent *dp; + DIR *dirp; + struct de de; + int truncated; + + if ((dirp = mg_opendir(conn, dir)) == NULL) { + return 0; + } else { + de.conn = conn; + + while ((dp = mg_readdir(dirp)) != NULL) { + /* Do not show current dir and hidden files */ + if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..") + || must_hide_file(conn, dp->d_name)) { + continue; + } + + mg_snprintf( + conn, &truncated, path, sizeof(path), "%s/%s", dir, dp->d_name); + + /* If we don't memset stat structure to zero, mtime will have + * garbage and strftime() will segfault later on in + * print_dir_entry(). memset is required only if mg_stat() + * fails. For more details, see + * http://code.google.com/p/mongoose/issues/detail?id=79 */ + memset(&de.file, 0, sizeof(de.file)); + + if (truncated) { + /* If the path is not complete, skip processing. */ + continue; + } + + if (!mg_stat(conn, path, &de.file)) { + mg_cry(conn, + "%s: mg_stat(%s) failed: %s", + __func__, + path, + strerror(ERRNO)); + } + de.file_name = dp->d_name; + cb(&de, data); + } + (void)mg_closedir(dirp); + } + return 1; +} + + +#if !defined(NO_FILES) +static int +remove_directory(struct mg_connection *conn, const char *dir) +{ + char path[PATH_MAX]; + struct dirent *dp; + DIR *dirp; + struct de de; + int truncated; + int ok = 1; + + if ((dirp = mg_opendir(conn, dir)) == NULL) { + return 0; + } else { + de.conn = conn; + + while ((dp = mg_readdir(dirp)) != NULL) { + /* Do not show current dir (but show hidden files as they will + * also be removed) */ + if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..")) { + continue; + } + + mg_snprintf( + conn, &truncated, path, sizeof(path), "%s/%s", dir, dp->d_name); + + /* If we don't memset stat structure to zero, mtime will have + * garbage and strftime() will segfault later on in + * print_dir_entry(). memset is required only if mg_stat() + * fails. For more details, see + * http://code.google.com/p/mongoose/issues/detail?id=79 */ + memset(&de.file, 0, sizeof(de.file)); + + if (truncated) { + /* Do not delete anything shorter */ + ok = 0; + continue; + } + + if (!mg_stat(conn, path, &de.file)) { + mg_cry(conn, + "%s: mg_stat(%s) failed: %s", + __func__, + path, + strerror(ERRNO)); + ok = 0; + } + if (de.file.membuf == NULL) { + /* file is not in memory */ + if (de.file.is_directory) { + if (remove_directory(conn, path) == 0) { + ok = 0; + } + } else { + if (mg_remove(conn, path) == 0) { + ok = 0; + } + } + } else { + /* file is in memory. It can not be deleted. */ + ok = 0; + } + } + (void)mg_closedir(dirp); + + IGNORE_UNUSED_RESULT(rmdir(dir)); + } + + return ok; +} +#endif + + +struct dir_scan_data { + struct de *entries; + unsigned int num_entries; + unsigned int arr_size; +}; + + +/* Behaves like realloc(), but frees original pointer on failure */ +static void * +realloc2(void *ptr, size_t size) +{ + void *new_ptr = mg_realloc(ptr, size); + if (new_ptr == NULL) { + mg_free(ptr); + } + return new_ptr; +} + + +static void +dir_scan_callback(struct de *de, void *data) +{ + struct dir_scan_data *dsd = (struct dir_scan_data *)data; + + if (dsd->entries == NULL || dsd->num_entries >= dsd->arr_size) { + dsd->arr_size *= 2; + dsd->entries = + (struct de *)realloc2(dsd->entries, + dsd->arr_size * sizeof(dsd->entries[0])); + } + if (dsd->entries == NULL) { + /* TODO(lsm, low): propagate an error to the caller */ + dsd->num_entries = 0; + } else { + dsd->entries[dsd->num_entries].file_name = mg_strdup(de->file_name); + dsd->entries[dsd->num_entries].file = de->file; + dsd->entries[dsd->num_entries].conn = de->conn; + dsd->num_entries++; + } +} + + +static void +handle_directory_request(struct mg_connection *conn, const char *dir) +{ + unsigned int i; + int sort_direction; + struct dir_scan_data data = {NULL, 0, 128}; + char date[64]; + time_t curtime = time(NULL); + + if (!scan_directory(conn, dir, &data, dir_scan_callback)) { + send_http_error(conn, + 500, + "Error: Cannot open directory\nopendir(%s): %s", + dir, + strerror(ERRNO)); + return; + } + + gmt_time_string(date, sizeof(date), &curtime); + + if (!conn) { + return; + } + + sort_direction = conn->request_info.query_string != NULL + && conn->request_info.query_string[1] == 'd' + ? 'a' + : 'd'; + + conn->must_close = 1; + mg_printf(conn, "HTTP/1.1 200 OK\r\n"); + send_static_cache_header(conn); + mg_printf(conn, + "Date: %s\r\n" + "Connection: close\r\n" + "Content-Type: text/html; charset=utf-8\r\n\r\n", + date); + + conn->num_bytes_sent += + mg_printf(conn, + "Index of %s" + "" + "

Index of %s

"
+	              ""
+	              ""
+	              ""
+	              "",
+	              conn->request_info.local_uri,
+	              conn->request_info.local_uri,
+	              sort_direction,
+	              sort_direction,
+	              sort_direction);
+
+	/* Print first entry - link to a parent directory */
+	conn->num_bytes_sent +=
+	    mg_printf(conn,
+	              ""
+	              "\n",
+	              conn->request_info.local_uri,
+	              "..",
+	              "Parent directory",
+	              "-",
+	              "-");
+
+	/* Sort and print directory entries */
+	if (data.entries != NULL) {
+		qsort(data.entries,
+		      (size_t)data.num_entries,
+		      sizeof(data.entries[0]),
+		      compare_dir_entries);
+		for (i = 0; i < data.num_entries; i++) {
+			print_dir_entry(&data.entries[i]);
+			mg_free(data.entries[i].file_name);
+		}
+		mg_free(data.entries);
+	}
+
+	conn->num_bytes_sent += mg_printf(conn, "%s", "
NameModifiedSize

%s %s  %s
"); + conn->status_code = 200; +} + + +/* Send len bytes from the opened file to the client. */ +static void +send_file_data(struct mg_connection *conn, + struct file *filep, + int64_t offset, + int64_t len) +{ + char buf[MG_BUF_LEN]; + int to_read, num_read, num_written; + int64_t size; + + if (!filep || !conn) { + return; + } + + /* Sanity check the offset */ + size = filep->size > INT64_MAX ? INT64_MAX : (int64_t)(filep->size); + offset = offset < 0 ? 0 : offset > size ? size : offset; + + if (len > 0 && filep->membuf != NULL && size > 0) { + /* file stored in memory */ + if (len > size - offset) { + len = size - offset; + } + mg_write(conn, filep->membuf + offset, (size_t)len); + } else if (len > 0 && filep->fp != NULL) { +/* file stored on disk */ +#if defined(__linux__) + /* sendfile is only available for Linux */ + if (conn->throttle == 0 && conn->ssl == 0) { + off_t sf_offs = (off_t)offset; + ssize_t sf_sent; + int sf_file = fileno(filep->fp); + int loop_cnt = 0; + + do { + /* 2147479552 (0x7FFFF000) is a limit found by experiment on + * 64 bit Linux (2^31 minus one memory page of 4k?). */ + size_t sf_tosend = + (size_t)((len < 0x7FFFF000) ? len : 0x7FFFF000); + sf_sent = + sendfile(conn->client.sock, sf_file, &sf_offs, sf_tosend); + if (sf_sent > 0) { + conn->num_bytes_sent += sf_sent; + len -= sf_sent; + offset += sf_sent; + } else if (loop_cnt == 0) { + /* This file can not be sent using sendfile. + * This might be the case for pseudo-files in the + * /sys/ and /proc/ file system. + * Use the regular user mode copy code instead. */ + break; + } else if (sf_sent == 0) { + /* No error, but 0 bytes sent. May be EOF? */ + return; + } + loop_cnt++; + + } while ((len > 0) && (sf_sent >= 0)); + + if (sf_sent > 0) { + return; /* OK */ + } + + /* sf_sent<0 means error, thus fall back to the classic way */ + /* This is always the case, if sf_file is not a "normal" file, + * e.g., for sending data from the output of a CGI process. */ + offset = (int64_t)sf_offs; + } +#endif + if ((offset > 0) && (fseeko(filep->fp, offset, SEEK_SET) != 0)) { + mg_cry(conn, "%s: fseeko() failed: %s", __func__, strerror(ERRNO)); + send_http_error( + conn, + 500, + "%s", + "Error: Unable to access file at requested position."); + } else { + while (len > 0) { + /* Calculate how much to read from the file in the buffer */ + to_read = sizeof(buf); + if ((int64_t)to_read > len) { + to_read = (int)len; + } + + /* Read from file, exit the loop on error */ + if ((num_read = (int)fread(buf, 1, (size_t)to_read, filep->fp)) + <= 0) { + break; + } + + /* Send read bytes to the client, exit the loop on error */ + if ((num_written = mg_write(conn, buf, (size_t)num_read)) + != num_read) { + break; + } + + /* Both read and were successful, adjust counters */ + conn->num_bytes_sent += num_written; + len -= num_written; + } + } + } +} + + +static int +parse_range_header(const char *header, int64_t *a, int64_t *b) +{ + return sscanf(header, "bytes=%" INT64_FMT "-%" INT64_FMT, a, b); +} + + +static void +construct_etag(char *buf, size_t buf_len, const struct file *filep) +{ + if (filep != NULL && buf != NULL) { + mg_snprintf(NULL, + NULL, /* All calls to construct_etag use 64 byte buffer */ + buf, + buf_len, + "\"%lx.%" INT64_FMT "\"", + (unsigned long)filep->last_modified, + filep->size); + } +} + + +static void +fclose_on_exec(struct file *filep, struct mg_connection *conn) +{ + if (filep != NULL && filep->fp != NULL) { +#ifdef _WIN32 + (void)conn; /* Unused. */ +#else + if (fcntl(fileno(filep->fp), F_SETFD, FD_CLOEXEC) != 0) { + mg_cry(conn, + "%s: fcntl(F_SETFD FD_CLOEXEC) failed: %s", + __func__, + strerror(ERRNO)); + } +#endif + } +} + + +static void +handle_static_file_request(struct mg_connection *conn, + const char *path, + struct file *filep, + const char *mime_type) +{ + char date[64], lm[64], etag[64]; + char range[128]; /* large enough, so there will be no overflow */ + const char *msg = "OK", *hdr; + time_t curtime = time(NULL); + int64_t cl, r1, r2; + struct vec mime_vec; + int n, truncated; + char gz_path[PATH_MAX]; + const char *encoding = ""; + const char *cors1, *cors2, *cors3; + + if (conn == NULL || conn->ctx == NULL || filep == NULL) { + return; + } + + if (mime_type == NULL) { + get_mime_type(conn->ctx, path, &mime_vec); + } else { + mime_vec.ptr = mime_type; + mime_vec.len = strlen(mime_type); + } + if (filep->size > INT64_MAX) { + send_http_error(conn, + 500, + "Error: File size is too large to send\n%" INT64_FMT, + filep->size); + } + cl = (int64_t)filep->size; + conn->status_code = 200; + range[0] = '\0'; + + /* if this file is in fact a pre-gzipped file, rewrite its filename + * it's important to rewrite the filename after resolving + * the mime type from it, to preserve the actual file's type */ + if (filep->gzipped) { + mg_snprintf(conn, &truncated, gz_path, sizeof(gz_path), "%s.gz", path); + + if (truncated) { + send_http_error(conn, + 500, + "Error: Path of zipped file too long (%s)", + path); + return; + } + + path = gz_path; + encoding = "Content-Encoding: gzip\r\n"; + } + + if (!mg_fopen(conn, path, "rb", filep)) { + send_http_error(conn, + 500, + "Error: Cannot open file\nfopen(%s): %s", + path, + strerror(ERRNO)); + return; + } + + fclose_on_exec(filep, conn); + + /* If Range: header specified, act accordingly */ + r1 = r2 = 0; + hdr = mg_get_header(conn, "Range"); + if (hdr != NULL && (n = parse_range_header(hdr, &r1, &r2)) > 0 && r1 >= 0 + && r2 >= 0) { + /* actually, range requests don't play well with a pre-gzipped + * file (since the range is specified in the uncompressed space) */ + if (filep->gzipped) { + send_http_error( + conn, + 501, + "%s", + "Error: Range requests in gzipped files are not supported"); + mg_fclose(filep); + return; + } + conn->status_code = 206; + cl = n == 2 ? (r2 > cl ? cl : r2) - r1 + 1 : cl - r1; + mg_snprintf(conn, + NULL, /* range buffer is big enough */ + range, + sizeof(range), + "Content-Range: bytes " + "%" INT64_FMT "-%" INT64_FMT "/%" INT64_FMT "\r\n", + r1, + r1 + cl - 1, + filep->size); + msg = "Partial Content"; + } + + hdr = mg_get_header(conn, "Origin"); + if (hdr) { + /* Cross-origin resource sharing (CORS), see + * http://www.html5rocks.com/en/tutorials/cors/, + * http://www.html5rocks.com/static/images/cors_server_flowchart.png - + * preflight is not supported for files. */ + cors1 = "Access-Control-Allow-Origin: "; + cors2 = conn->ctx->config[ACCESS_CONTROL_ALLOW_ORIGIN]; + cors3 = "\r\n"; + } else { + cors1 = cors2 = cors3 = ""; + } + + /* Prepare Etag, Date, Last-Modified headers. Must be in UTC, according to + * http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3 */ + gmt_time_string(date, sizeof(date), &curtime); + gmt_time_string(lm, sizeof(lm), &filep->last_modified); + construct_etag(etag, sizeof(etag), filep); + + (void)mg_printf(conn, + "HTTP/1.1 %d %s\r\n" + "%s%s%s" + "Date: %s\r\n", + conn->status_code, + msg, + cors1, + cors2, + cors3, + date); + send_static_cache_header(conn); + (void)mg_printf(conn, + "Last-Modified: %s\r\n" + "Etag: %s\r\n" + "Content-Type: %.*s\r\n" + "Content-Length: %" INT64_FMT "\r\n" + "Connection: %s\r\n" + "Accept-Ranges: bytes\r\n" + "%s%s\r\n", + lm, + etag, + (int)mime_vec.len, + mime_vec.ptr, + cl, + suggest_connection_header(conn), + range, + encoding); + + if (strcmp(conn->request_info.request_method, "HEAD") != 0) { + send_file_data(conn, filep, r1, cl); + } + mg_fclose(filep); +} + + +void +mg_send_file(struct mg_connection *conn, const char *path) +{ + mg_send_mime_file(conn, path, NULL); +} + + +void +mg_send_mime_file(struct mg_connection *conn, + const char *path, + const char *mime_type) +{ + struct file file = STRUCT_FILE_INITIALIZER; + if (mg_stat(conn, path, &file)) { + if (file.is_directory) { + if (!conn) { + return; + } + if (!mg_strcasecmp(conn->ctx->config[ENABLE_DIRECTORY_LISTING], + "yes")) { + handle_directory_request(conn, path); + } else { + send_http_error(conn, + 403, + "%s", + "Error: Directory listing denied"); + } + } else { + handle_static_file_request(conn, path, &file, mime_type); + } + } else { + send_http_error(conn, 404, "%s", "Error: File not found"); + } +} + + +/* For a given PUT path, create all intermediate subdirectories. + * Return 0 if the path itself is a directory. + * Return 1 if the path leads to a file. + * Return -1 for if the path is too long. + * Return -2 if path can not be created. +*/ +static int +put_dir(struct mg_connection *conn, const char *path) +{ + char buf[PATH_MAX]; + const char *s, *p; + struct file file = STRUCT_FILE_INITIALIZER; + size_t len; + int res = 1; + + for (s = p = path + 2; (p = strchr(s, '/')) != NULL; s = ++p) { + len = (size_t)(p - path); + if (len >= sizeof(buf)) { + /* path too long */ + res = -1; + break; + } + memcpy(buf, path, len); + buf[len] = '\0'; + + /* Try to create intermediate directory */ + DEBUG_TRACE("mkdir(%s)", buf); + if (!mg_stat(conn, buf, &file) && mg_mkdir(conn, buf, 0755) != 0) { + /* path does not exixt and can not be created */ + res = -2; + break; + } + + /* Is path itself a directory? */ + if (p[1] == '\0') { + res = 0; + } + } + + return res; +} + + +static void +remove_bad_file(const struct mg_connection *conn, const char *path) +{ + int r = mg_remove(conn, path); + if (r != 0) { + mg_cry(conn, "%s: Cannot remove invalid file %s", __func__, path); + } +} + + +long long +mg_store_body(struct mg_connection *conn, const char *path) +{ + char buf[MG_BUF_LEN]; + long long len = 0; + int ret, n; + struct file fi; + + if (conn->consumed_content != 0) { + mg_cry(conn, "%s: Contents already consumed", __func__); + return -11; + } + + ret = put_dir(conn, path); + if (ret < 0) { + /* -1 for path too long, + * -2 for path can not be created. */ + return ret; + } + if (ret != 1) { + /* Return 0 means, path itself is a directory. */ + return 0; + } + + if (mg_fopen(conn, path, "w", &fi) == 0) { + return -12; + } + + ret = mg_read(conn, buf, sizeof(buf)); + while (ret > 0) { + n = (int)fwrite(buf, 1, (size_t)ret, fi.fp); + if (n != ret) { + mg_fclose(&fi); + remove_bad_file(conn, path); + return -13; + } + ret = mg_read(conn, buf, sizeof(buf)); + } + + /* TODO: mg_fclose should return an error, + * and every caller should check and handle it. */ + if (fclose(fi.fp) != 0) { + remove_bad_file(conn, path); + return -14; + } + + return len; +} + + +/* Parse HTTP headers from the given buffer, advance buffer to the point + * where parsing stopped. */ +static void +parse_http_headers(char **buf, struct mg_request_info *ri) +{ + int i; + + if (!ri) { + return; + } + + ri->num_headers = 0; + + for (i = 0; i < (int)ARRAY_SIZE(ri->http_headers); i++) { + char *dp = *buf; + while ((*dp != ':') && (*dp != '\r') && (*dp != 0)) { + dp++; + } + if (!*dp) { + /* neither : nor \r\n. This is not a valid field. */ + break; + } + if (*dp == '\r') { + if (dp[1] == '\n') { + /* \r\n */ + ri->http_headers[i].name = *buf; + ri->http_headers[i].value = 0; + *buf = dp; + } else { + /* stray \r. This is not valid. */ + break; + } + } else { + /* (*dp == ':') */ + *dp = 0; + ri->http_headers[i].name = *buf; + do { + dp++; + } while (*dp == ' '); + + ri->http_headers[i].value = dp; + *buf = strstr(dp, "\r\n"); + } + + ri->num_headers = i + 1; + if (*buf) { + (*buf)[0] = 0; + (*buf)[1] = 0; + *buf += 2; + } else { + *buf = dp; + break; + } + + if (*buf[0] == '\r') { + /* This is the end of the header */ + break; + } + } +} + + +static int +is_valid_http_method(const char *method) +{ + return !strcmp(method, "GET") /* HTTP (RFC 2616) */ + || !strcmp(method, "POST") /* HTTP (RFC 2616) */ + || !strcmp(method, "HEAD") /* HTTP (RFC 2616) */ + || !strcmp(method, "PUT") /* HTTP (RFC 2616) */ + || !strcmp(method, "DELETE") /* HTTP (RFC 2616) */ + || !strcmp(method, "OPTIONS") /* HTTP (RFC 2616) */ + /* TRACE method (RFC 2616) is not supported for security reasons */ + || !strcmp(method, "CONNECT") /* HTTP (RFC 2616) */ + + || !strcmp(method, "PROPFIND") /* WEBDAV (RFC 2518) */ + || !strcmp(method, "MKCOL") /* WEBDAV (RFC 2518) */ + + /* Unsupported WEBDAV Methods: */ + /* PROPPATCH, COPY, MOVE, LOCK, UNLOCK (RFC 2518) */ + /* + 11 methods from RFC 3253 */ + /* ORDERPATCH (RFC 3648) */ + /* ACL (RFC 3744) */ + /* SEARCH (RFC 5323) */ + /* + MicroSoft extensions + * https://msdn.microsoft.com/en-us/library/aa142917.aspx */ + + /* PATCH method only allowed for CGI/Lua/LSP and callbacks. */ + || !strcmp(method, "PATCH"); /* PATCH method (RFC 5789) */ +} + + +/* Parse HTTP request, fill in mg_request_info structure. + * This function modifies the buffer by NUL-terminating + * HTTP request components, header names and header values. */ +static int +parse_http_message(char *buf, int len, struct mg_request_info *ri) +{ + int is_request, request_length; + + if (!ri) { + return 0; + } + + request_length = get_request_len(buf, len); + + if (request_length > 0) { + /* Reset attributes. DO NOT TOUCH is_ssl, remote_ip, remote_addr, + * remote_port */ + ri->remote_user = ri->request_method = ri->request_uri = + ri->http_version = NULL; + ri->num_headers = 0; + + buf[request_length - 1] = '\0'; + + /* RFC says that all initial whitespaces should be ingored */ + while (*buf != '\0' && isspace(*(unsigned char *)buf)) { + buf++; + } + ri->request_method = skip(&buf, " "); + ri->request_uri = skip(&buf, " "); + ri->http_version = skip(&buf, "\r\n"); + + /* HTTP message could be either HTTP request or HTTP response, e.g. + * "GET / HTTP/1.0 ...." or "HTTP/1.0 200 OK ..." */ + is_request = is_valid_http_method(ri->request_method); + if ((is_request && memcmp(ri->http_version, "HTTP/", 5) != 0) + || (!is_request && memcmp(ri->request_method, "HTTP/", 5) != 0)) { + request_length = -1; + } else { + if (is_request) { + ri->http_version += 5; + } + parse_http_headers(&buf, ri); + } + } + return request_length; +} + + +/* Keep reading the input (either opened file descriptor fd, or socket sock, + * or SSL descriptor ssl) into buffer buf, until \r\n\r\n appears in the + * buffer (which marks the end of HTTP request). Buffer buf may already + * have some data. The length of the data is stored in nread. + * Upon every read operation, increase nread by the number of bytes read. */ +static int +read_request(FILE *fp, + struct mg_connection *conn, + char *buf, + int bufsiz, + int *nread) +{ + int request_len, n = 0; + struct timespec last_action_time; + double request_timeout; + + if (!conn) { + return 0; + } + + memset(&last_action_time, 0, sizeof(last_action_time)); + + if (conn->ctx->config[REQUEST_TIMEOUT]) { + /* value of request_timeout is in seconds, config in milliseconds */ + request_timeout = atof(conn->ctx->config[REQUEST_TIMEOUT]) / 1000.0; + } else { + request_timeout = -1.0; + } + + request_len = get_request_len(buf, *nread); + + /* first time reading from this connection */ + clock_gettime(CLOCK_MONOTONIC, &last_action_time); + + while ( + (conn->ctx->stop_flag == 0) && (*nread < bufsiz) && (request_len == 0) + && ((mg_difftimespec(&last_action_time, &(conn->req_time)) + <= request_timeout) || (request_timeout < 0)) + && ((n = pull(fp, conn, buf + *nread, bufsiz - *nread, request_timeout)) + > 0)) { + *nread += n; + /* assert(*nread <= bufsiz); */ + if (*nread > bufsiz) { + return -2; + } + request_len = get_request_len(buf, *nread); + if (request_timeout > 0.0) { + clock_gettime(CLOCK_MONOTONIC, &last_action_time); + } + } + + return (request_len <= 0 && n <= 0) ? -1 : request_len; +} + +#if !defined(NO_FILES) +/* For given directory path, substitute it to valid index file. + * Return 1 if index file has been found, 0 if not found. + * If the file is found, it's stats is returned in stp. */ +static int +substitute_index_file(struct mg_connection *conn, + char *path, + size_t path_len, + struct file *filep) +{ + if (conn && conn->ctx) { + const char *list = conn->ctx->config[INDEX_FILES]; + struct file file = STRUCT_FILE_INITIALIZER; + struct vec filename_vec; + size_t n = strlen(path); + int found = 0; + + /* The 'path' given to us points to the directory. Remove all trailing + * directory separator characters from the end of the path, and + * then append single directory separator character. */ + while (n > 0 && path[n - 1] == '/') { + n--; + } + path[n] = '/'; + + /* Traverse index files list. For each entry, append it to the given + * path and see if the file exists. If it exists, break the loop */ + while ((list = next_option(list, &filename_vec, NULL)) != NULL) { + /* Ignore too long entries that may overflow path buffer */ + if (filename_vec.len > path_len - (n + 2)) { + continue; + } + + /* Prepare full path to the index file */ + mg_strlcpy(path + n + 1, filename_vec.ptr, filename_vec.len + 1); + + /* Does it exist? */ + if (mg_stat(conn, path, &file)) { + /* Yes it does, break the loop */ + *filep = file; + found = 1; + break; + } + } + + /* If no index file exists, restore directory path */ + if (!found) { + path[n] = '\0'; + } + + return found; + } + return 0; +} +#endif + + +#if !defined(NO_CACHING) +/* Return True if we should reply 304 Not Modified. */ +static int +is_not_modified(const struct mg_connection *conn, const struct file *filep) +{ + char etag[64]; + const char *ims = mg_get_header(conn, "If-Modified-Since"); + const char *inm = mg_get_header(conn, "If-None-Match"); + construct_etag(etag, sizeof(etag), filep); + if (!filep) { + return 0; + } + return (inm != NULL && !mg_strcasecmp(etag, inm)) + || (ims != NULL && (filep->last_modified <= parse_date_string(ims))); +} +#endif /* !NO_CACHING */ + + +#if !defined(NO_CGI) || !defined(NO_FILES) +static int +forward_body_data(struct mg_connection *conn, FILE *fp, SOCKET sock, SSL *ssl) +{ + const char *expect, *body; + char buf[MG_BUF_LEN]; + int to_read, nread, success = 0; + int64_t buffered_len; + double timeout = -1.0; + + if (!conn) { + return 0; + } + if (conn->ctx->config[REQUEST_TIMEOUT]) { + timeout = atoi(conn->ctx->config[REQUEST_TIMEOUT]) / 1000.0; + } + + expect = mg_get_header(conn, "Expect"); + /* assert(fp != NULL); */ + if (!fp) { + send_http_error(conn, 500, "%s", "Error: NULL File"); + return 0; + } + + if (conn->content_len == -1 && !conn->is_chunked) { + /* Content length is not specified by the client. */ + send_http_error(conn, + 411, + "%s", + "Error: Client did not specify content length"); + } else if ((expect != NULL) + && (mg_strcasecmp(expect, "100-continue") != 0)) { + /* Client sent an "Expect: xyz" header and xyz is not 100-continue. */ + send_http_error(conn, + 417, + "Error: Can not fulfill expectation %s", + expect); + } else { + if (expect != NULL) { + (void)mg_printf(conn, "%s", "HTTP/1.1 100 Continue\r\n\r\n"); + conn->status_code = 100; + } else { + conn->status_code = 200; + } + + buffered_len = (int64_t)(conn->data_len) - (int64_t)conn->request_len + - conn->consumed_content; + + /* assert(buffered_len >= 0); */ + /* assert(conn->consumed_content == 0); */ + + if ((buffered_len < 0) || (conn->consumed_content != 0)) { + send_http_error(conn, 500, "%s", "Error: Size mismatch"); + return 0; + } + + if (buffered_len > 0) { + if ((int64_t)buffered_len > conn->content_len) { + buffered_len = (int)conn->content_len; + } + body = conn->buf + conn->request_len + conn->consumed_content; + push_all(conn->ctx, fp, sock, ssl, body, (int64_t)buffered_len); + conn->consumed_content += buffered_len; + } + + nread = 0; + while (conn->consumed_content < conn->content_len) { + to_read = sizeof(buf); + if ((int64_t)to_read > conn->content_len - conn->consumed_content) { + to_read = (int)(conn->content_len - conn->consumed_content); + } + nread = pull(NULL, conn, buf, to_read, timeout); + if (nread <= 0 + || push_all(conn->ctx, fp, sock, ssl, buf, nread) != nread) { + break; + } + conn->consumed_content += nread; + } + + if (conn->consumed_content == conn->content_len) { + success = (nread >= 0); + } + + /* Each error code path in this function must send an error */ + if (!success) { + /* NOTE: Maybe some data has already been sent. */ + /* TODO (low): If some data has been sent, a correct error + * reply can no longer be sent, so just close the connection */ + send_http_error(conn, 500, "%s", ""); + } + } + + return success; +} +#endif + +#if !defined(NO_CGI) +/* This structure helps to create an environment for the spawned CGI program. + * Environment is an array of "VARIABLE=VALUE\0" ASCIIZ strings, + * last element must be NULL. + * However, on Windows there is a requirement that all these VARIABLE=VALUE\0 + * strings must reside in a contiguous buffer. The end of the buffer is + * marked by two '\0' characters. + * We satisfy both worlds: we create an envp array (which is vars), all + * entries are actually pointers inside buf. */ +struct cgi_environment { + struct mg_connection *conn; + /* Data block */ + char *buf; /* Environment buffer */ + size_t buflen; /* Space available in buf */ + size_t bufused; /* Space taken in buf */ + /* Index block */ + char **var; /* char **envp */ + size_t varlen; /* Number of variables available in var */ + size_t varused; /* Number of variables stored in var */ +}; + + +static void addenv(struct cgi_environment *env, + PRINTF_FORMAT_STRING(const char *fmt), + ...) PRINTF_ARGS(2, 3); + +/* Append VARIABLE=VALUE\0 string to the buffer, and add a respective + * pointer into the vars array. Assumes env != NULL and fmt != NULL. */ +static void +addenv(struct cgi_environment *env, const char *fmt, ...) +{ + size_t n, space; + int truncated; + char *added; + va_list ap; + + /* Calculate how much space is left in the buffer */ + space = (env->buflen - env->bufused); + + /* Calculate an estimate for the required space */ + n = strlen(fmt) + 2 + 128; + + do { + if (space <= n) { + /* Allocate new buffer */ + n = env->buflen + CGI_ENVIRONMENT_SIZE; + added = (char *)mg_realloc(env->buf, n); + if (!added) { + /* Out of memory */ + mg_cry(env->conn, + "%s: Cannot allocate memory for CGI variable [%s]", + __func__, + fmt); + return; + } + env->buf = added; + env->buflen = n; + space = (env->buflen - env->bufused); + } + + /* Make a pointer to the free space int the buffer */ + added = env->buf + env->bufused; + + /* Copy VARIABLE=VALUE\0 string into the free space */ + va_start(ap, fmt); + mg_vsnprintf(env->conn, &truncated, added, (size_t)space, fmt, ap); + va_end(ap); + + /* Do not add truncated strings to the environment */ + if (truncated) { + /* Reallocate the buffer */ + space = 0; + n = 1; + } + } while (truncated); + + /* Calculate number of bytes added to the environment */ + n = strlen(added) + 1; + env->bufused += n; + + /* Now update the variable index */ + space = (env->varlen - env->varused); + if (space < 2) { + mg_cry(env->conn, + "%s: Cannot register CGI variable [%s]", + __func__, + fmt); + return; + } + + /* Append a pointer to the added string into the envp array */ + env->var[env->varused] = added; + env->varused++; +} + + +static void +prepare_cgi_environment(struct mg_connection *conn, + const char *prog, + struct cgi_environment *env) +{ + const char *s; + struct vec var_vec; + char *p, src_addr[IP_ADDR_STR_LEN], http_var_name[128]; + int i, truncated; + + if (conn == NULL || prog == NULL || env == NULL) { + return; + } + + env->conn = conn; + env->buflen = CGI_ENVIRONMENT_SIZE; + env->bufused = 0; + env->buf = (char *)mg_malloc(env->buflen); + env->varlen = MAX_CGI_ENVIR_VARS; + env->varused = 0; + env->var = (char **)mg_malloc(env->buflen * sizeof(char *)); + + addenv(env, "SERVER_NAME=%s", conn->ctx->config[AUTHENTICATION_DOMAIN]); + addenv(env, "SERVER_ROOT=%s", conn->ctx->config[DOCUMENT_ROOT]); + addenv(env, "DOCUMENT_ROOT=%s", conn->ctx->config[DOCUMENT_ROOT]); + addenv(env, "SERVER_SOFTWARE=%s/%s", "Civetweb", mg_version()); + + /* Prepare the environment block */ + addenv(env, "%s", "GATEWAY_INTERFACE=CGI/1.1"); + addenv(env, "%s", "SERVER_PROTOCOL=HTTP/1.1"); + addenv(env, "%s", "REDIRECT_STATUS=200"); /* For PHP */ + +#if defined(USE_IPV6) + if (conn->client.lsa.sa.sa_family == AF_INET6) { + addenv(env, "SERVER_PORT=%d", ntohs(conn->client.lsa.sin6.sin6_port)); + } else +#endif + { + addenv(env, "SERVER_PORT=%d", ntohs(conn->client.lsa.sin.sin_port)); + } + + sockaddr_to_string(src_addr, sizeof(src_addr), &conn->client.rsa); + addenv(env, "REMOTE_ADDR=%s", src_addr); + + addenv(env, "REQUEST_METHOD=%s", conn->request_info.request_method); + addenv(env, "REMOTE_PORT=%d", conn->request_info.remote_port); + + addenv(env, "REQUEST_URI=%s", conn->request_info.request_uri); + addenv(env, "LOCAL_URI=%s", conn->request_info.local_uri); + + /* SCRIPT_NAME */ + addenv(env, + "SCRIPT_NAME=%.*s", + (int)strlen(conn->request_info.local_uri) + - ((conn->path_info == NULL) ? 0 : (int)strlen(conn->path_info)), + conn->request_info.local_uri); + + addenv(env, "SCRIPT_FILENAME=%s", prog); + if (conn->path_info == NULL) { + addenv(env, "PATH_TRANSLATED=%s", conn->ctx->config[DOCUMENT_ROOT]); + } else { + addenv(env, + "PATH_TRANSLATED=%s%s", + conn->ctx->config[DOCUMENT_ROOT], + conn->path_info); + } + + addenv(env, "HTTPS=%s", conn->ssl == NULL ? "off" : "on"); + + if ((s = mg_get_header(conn, "Content-Type")) != NULL) { + addenv(env, "CONTENT_TYPE=%s", s); + } + if (conn->request_info.query_string != NULL) { + addenv(env, "QUERY_STRING=%s", conn->request_info.query_string); + } + if ((s = mg_get_header(conn, "Content-Length")) != NULL) { + addenv(env, "CONTENT_LENGTH=%s", s); + } + if ((s = getenv("PATH")) != NULL) { + addenv(env, "PATH=%s", s); + } + if (conn->path_info != NULL) { + addenv(env, "PATH_INFO=%s", conn->path_info); + } + + if (conn->status_code > 0) { + /* CGI error handler should show the status code */ + addenv(env, "STATUS=%d", conn->status_code); + } + +#if defined(_WIN32) + if ((s = getenv("COMSPEC")) != NULL) { + addenv(env, "COMSPEC=%s", s); + } + if ((s = getenv("SYSTEMROOT")) != NULL) { + addenv(env, "SYSTEMROOT=%s", s); + } + if ((s = getenv("SystemDrive")) != NULL) { + addenv(env, "SystemDrive=%s", s); + } + if ((s = getenv("ProgramFiles")) != NULL) { + addenv(env, "ProgramFiles=%s", s); + } + if ((s = getenv("ProgramFiles(x86)")) != NULL) { + addenv(env, "ProgramFiles(x86)=%s", s); + } +#else + if ((s = getenv("LD_LIBRARY_PATH")) != NULL) { + addenv(env, "LD_LIBRARY_PATH=%s", s); + } +#endif /* _WIN32 */ + + if ((s = getenv("PERLLIB")) != NULL) { + addenv(env, "PERLLIB=%s", s); + } + + if (conn->request_info.remote_user != NULL) { + addenv(env, "REMOTE_USER=%s", conn->request_info.remote_user); + addenv(env, "%s", "AUTH_TYPE=Digest"); + } + + /* Add all headers as HTTP_* variables */ + for (i = 0; i < conn->request_info.num_headers; i++) { + + (void)mg_snprintf(conn, + &truncated, + http_var_name, + sizeof(http_var_name), + "HTTP_%s", + conn->request_info.http_headers[i].name); + + if (truncated) { + mg_cry(conn, + "%s: HTTP header variable too long [%s]", + __func__, + conn->request_info.http_headers[i].name); + continue; + } + + /* Convert variable name into uppercase, and change - to _ */ + for (p = http_var_name; *p != '\0'; p++) { + if (*p == '-') { + *p = '_'; + } + *p = (char)toupper(*(unsigned char *)p); + } + + addenv(env, + "%s=%s", + http_var_name, + conn->request_info.http_headers[i].value); + } + + /* Add user-specified variables */ + s = conn->ctx->config[CGI_ENVIRONMENT]; + while ((s = next_option(s, &var_vec, NULL)) != NULL) { + addenv(env, "%.*s", (int)var_vec.len, var_vec.ptr); + } + + env->var[env->varused] = NULL; + env->buf[env->bufused] = '\0'; +} + + +static void +handle_cgi_request(struct mg_connection *conn, const char *prog) +{ + char *buf; + size_t buflen; + int headers_len, data_len, i, truncated; + int fdin[2] = {-1, -1}, fdout[2] = {-1, -1}, fderr[2] = {-1, -1}; + const char *status, *status_text, *connection_state; + char *pbuf, dir[PATH_MAX], *p; + struct mg_request_info ri; + struct cgi_environment blk; + FILE *in = NULL, *out = NULL, *err = NULL; + struct file fout = STRUCT_FILE_INITIALIZER; + pid_t pid = (pid_t)-1; + + if (conn == NULL) { + return; + } + + buf = NULL; + buflen = 16384; + prepare_cgi_environment(conn, prog, &blk); + + /* CGI must be executed in its own directory. 'dir' must point to the + * directory containing executable program, 'p' must point to the + * executable program name relative to 'dir'. */ + (void)mg_snprintf(conn, &truncated, dir, sizeof(dir), "%s", prog); + + if (truncated) { + mg_cry(conn, "Error: CGI program \"%s\": Path too long", prog); + send_http_error(conn, 500, "Error: %s", "CGI path too long"); + goto done; + } + + if ((p = strrchr(dir, '/')) != NULL) { + *p++ = '\0'; + } else { + dir[0] = '.', dir[1] = '\0'; + p = (char *)prog; + } + + if (pipe(fdin) != 0 || pipe(fdout) != 0 || pipe(fderr) != 0) { + status = strerror(ERRNO); + mg_cry(conn, + "Error: CGI program \"%s\": Can not create CGI pipes: %s", + prog, + status); + send_http_error(conn, 500, "Error: Cannot create CGI pipe: %s", status); + goto done; + } + + pid = spawn_process(conn, p, blk.buf, blk.var, fdin, fdout, fderr, dir); + + if (pid == (pid_t)-1) { + status = strerror(ERRNO); + mg_cry(conn, + "Error: CGI program \"%s\": Can not spawn CGI process: %s", + prog, + status); + send_http_error(conn, + 500, + "Error: Cannot spawn CGI process [%s]: %s", + prog, + status); + goto done; + } + + /* Make sure child closes all pipe descriptors. It must dup them to 0,1 */ + set_close_on_exec((SOCKET)fdin[0], conn); /* stdin read */ + set_close_on_exec((SOCKET)fdout[1], conn); /* stdout write */ + set_close_on_exec((SOCKET)fderr[1], conn); /* stderr write */ + set_close_on_exec((SOCKET)fdin[1], conn); /* stdin write */ + set_close_on_exec((SOCKET)fdout[0], conn); /* stdout read */ + set_close_on_exec((SOCKET)fderr[0], conn); /* stderr read */ + + /* Parent closes only one side of the pipes. + * If we don't mark them as closed, close() attempt before + * return from this function throws an exception on Windows. + * Windows does not like when closed descriptor is closed again. */ + (void)close(fdin[0]); + (void)close(fdout[1]); + (void)close(fderr[1]); + fdin[0] = fdout[1] = fderr[1] = -1; + + if ((in = fdopen(fdin[1], "wb")) == NULL) { + status = strerror(ERRNO); + mg_cry(conn, + "Error: CGI program \"%s\": Can not open stdin: %s", + prog, + status); + send_http_error(conn, + 500, + "Error: CGI can not open fdin\nfopen: %s", + status); + goto done; + } + + if ((out = fdopen(fdout[0], "rb")) == NULL) { + status = strerror(ERRNO); + mg_cry(conn, + "Error: CGI program \"%s\": Can not open stdout: %s", + prog, + status); + send_http_error(conn, + 500, + "Error: CGI can not open fdout\nfopen: %s", + status); + goto done; + } + + if ((err = fdopen(fderr[0], "rb")) == NULL) { + status = strerror(ERRNO); + mg_cry(conn, + "Error: CGI program \"%s\": Can not open stderr: %s", + prog, + status); + send_http_error(conn, + 500, + "Error: CGI can not open fdout\nfopen: %s", + status); + goto done; + } + + setbuf(in, NULL); + setbuf(out, NULL); + setbuf(err, NULL); + fout.fp = out; + + if ((conn->request_info.content_length > 0) || conn->is_chunked) { + /* This is a POST/PUT request, or another request with body data. */ + if (!forward_body_data(conn, in, INVALID_SOCKET, NULL)) { + /* Error sending the body data */ + mg_cry(conn, + "Error: CGI program \"%s\": Forward body data failed", + prog); + goto done; + } + } + + /* Close so child gets an EOF. */ + fclose(in); + in = NULL; + fdin[1] = -1; + + /* Now read CGI reply into a buffer. We need to set correct + * status code, thus we need to see all HTTP headers first. + * Do not send anything back to client, until we buffer in all + * HTTP headers. */ + data_len = 0; + buf = (char *)mg_malloc(buflen); + if (buf == NULL) { + send_http_error(conn, + 500, + "Error: Not enough memory for CGI buffer (%u bytes)", + (unsigned int)buflen); + mg_cry(conn, + "Error: CGI program \"%s\": Not enough memory for buffer (%u " + "bytes)", + prog, + (unsigned int)buflen); + goto done; + } + headers_len = read_request(out, conn, buf, (int)buflen, &data_len); + if (headers_len <= 0) { + + /* Could not parse the CGI response. Check if some error message on + * stderr. */ + i = pull_all(err, conn, buf, (int)buflen); + if (i > 0) { + mg_cry(conn, + "Error: CGI program \"%s\" sent error " + "message: [%.*s]", + prog, + i, + buf); + send_http_error(conn, + 500, + "Error: CGI program \"%s\" sent error " + "message: [%.*s]", + prog, + i, + buf); + } else { + mg_cry(conn, + "Error: CGI program sent malformed or too big " + "(>%u bytes) HTTP headers: [%.*s]", + (unsigned)buflen, + data_len, + buf); + + send_http_error(conn, + 500, + "Error: CGI program sent malformed or too big " + "(>%u bytes) HTTP headers: [%.*s]", + (unsigned)buflen, + data_len, + buf); + } + + goto done; + } + pbuf = buf; + buf[headers_len - 1] = '\0'; + parse_http_headers(&pbuf, &ri); + + /* Make up and send the status line */ + status_text = "OK"; + if ((status = get_header(&ri, "Status")) != NULL) { + conn->status_code = atoi(status); + status_text = status; + while (isdigit(*(const unsigned char *)status_text) + || *status_text == ' ') { + status_text++; + } + } else if (get_header(&ri, "Location") != NULL) { + conn->status_code = 302; + } else { + conn->status_code = 200; + } + connection_state = get_header(&ri, "Connection"); + if (!header_has_option(connection_state, "keep-alive")) { + conn->must_close = 1; + } + (void)mg_printf(conn, "HTTP/1.1 %d %s\r\n", conn->status_code, status_text); + + /* Send headers */ + for (i = 0; i < ri.num_headers; i++) { + mg_printf(conn, + "%s: %s\r\n", + ri.http_headers[i].name, + ri.http_headers[i].value); + } + mg_write(conn, "\r\n", 2); + + /* Send chunk of data that may have been read after the headers */ + conn->num_bytes_sent += + mg_write(conn, buf + headers_len, (size_t)(data_len - headers_len)); + + /* Read the rest of CGI output and send to the client */ + send_file_data(conn, &fout, 0, INT64_MAX); + +done: + mg_free(blk.var); + mg_free(blk.buf); + + if (pid != (pid_t)-1) { + kill(pid, SIGKILL); +#if !defined(_WIN32) + { + int st; + while (waitpid(pid, &st, 0) != -1) + ; /* clean zombies */ + } +#endif + } + if (fdin[0] != -1) { + close(fdin[0]); + } + if (fdout[1] != -1) { + close(fdout[1]); + } + + if (in != NULL) { + fclose(in); + } else if (fdin[1] != -1) { + close(fdin[1]); + } + + if (out != NULL) { + fclose(out); + } else if (fdout[0] != -1) { + close(fdout[0]); + } + + if (err != NULL) { + fclose(err); + } else if (fderr[0] != -1) { + close(fderr[0]); + } + + if (buf != NULL) { + mg_free(buf); + } +} +#endif /* !NO_CGI */ + + +#if !defined(NO_FILES) +static void +mkcol(struct mg_connection *conn, const char *path) +{ + int rc, body_len; + struct de de; + char date[64]; + time_t curtime = time(NULL); + + if (conn == NULL) { + return; + } + + /* TODO (mid): Check the send_http_error situations in this function */ + + memset(&de.file, 0, sizeof(de.file)); + if (!mg_stat(conn, path, &de.file)) { + mg_cry(conn, + "%s: mg_stat(%s) failed: %s", + __func__, + path, + strerror(ERRNO)); + } + + if (de.file.last_modified) { + /* TODO (high): This check does not seem to make any sense ! */ + send_http_error( + conn, 405, "Error: mkcol(%s): %s", path, strerror(ERRNO)); + return; + } + + body_len = conn->data_len - conn->request_len; + if (body_len > 0) { + send_http_error( + conn, 415, "Error: mkcol(%s): %s", path, strerror(ERRNO)); + return; + } + + rc = mg_mkdir(conn, path, 0755); + + if (rc == 0) { + conn->status_code = 201; + gmt_time_string(date, sizeof(date), &curtime); + mg_printf(conn, + "HTTP/1.1 %d Created\r\n" + "Date: %s\r\n", + conn->status_code, + date); + send_static_cache_header(conn); + mg_printf(conn, + "Content-Length: 0\r\n" + "Connection: %s\r\n\r\n", + suggest_connection_header(conn)); + } else if (rc == -1) { + if (errno == EEXIST) { + send_http_error( + conn, 405, "Error: mkcol(%s): %s", path, strerror(ERRNO)); + } else if (errno == EACCES) { + send_http_error( + conn, 403, "Error: mkcol(%s): %s", path, strerror(ERRNO)); + } else if (errno == ENOENT) { + send_http_error( + conn, 409, "Error: mkcol(%s): %s", path, strerror(ERRNO)); + } else { + send_http_error(conn, 500, "fopen(%s): %s", path, strerror(ERRNO)); + } + } +} + + +static void +put_file(struct mg_connection *conn, const char *path) +{ + struct file file = STRUCT_FILE_INITIALIZER; + const char *range; + int64_t r1, r2; + int rc; + char date[64]; + time_t curtime = time(NULL); + + if (conn == NULL) { + return; + } + + if (mg_stat(conn, path, &file)) { + /* File already exists */ + conn->status_code = 200; + + if (file.is_directory) { + /* This is an already existing directory, + * so there is nothing to do for the server. */ + rc = 0; + + } else { + /* File exists and is not a directory. */ + /* Can it be replaced? */ + + if (file.membuf != NULL) { + /* This is an "in-memory" file, that can not be replaced */ + send_http_error( + conn, + 405, + "Error: Put not possible\nReplacing %s is not supported", + path); + return; + } + + /* Check if the server may write this file */ + if (access(path, W_OK) == 0) { + /* Access granted */ + conn->status_code = 200; + rc = 1; + } else { + send_http_error( + conn, + 403, + "Error: Put not possible\nReplacing %s is not allowed", + path); + return; + } + } + } else { + /* File should be created */ + conn->status_code = 201; + rc = put_dir(conn, path); + } + + if (rc == 0) { + /* put_dir returns 0 if path is a directory */ + gmt_time_string(date, sizeof(date), &curtime); + mg_printf(conn, + "HTTP/1.1 %d %s\r\n", + conn->status_code, + mg_get_response_code_text(NULL, conn->status_code)); + send_no_cache_header(conn); + mg_printf(conn, + "Date: %s\r\n" + "Content-Length: 0\r\n" + "Connection: %s\r\n\r\n", + date, + suggest_connection_header(conn)); + + /* Request to create a directory has been fulfilled successfully. + * No need to put a file. */ + return; + } + + if (rc == -1) { + /* put_dir returns -1 if the path is too long */ + send_http_error(conn, + 414, + "Error: Path too long\nput_dir(%s): %s", + path, + strerror(ERRNO)); + return; + } + + if (rc == -2) { + /* put_dir returns -2 if the directory can not be created */ + send_http_error(conn, + 500, + "Error: Can not create directory\nput_dir(%s): %s", + path, + strerror(ERRNO)); + return; + } + + /* A file should be created or overwritten. */ + if (!mg_fopen(conn, path, "wb+", &file) || file.fp == NULL) { + mg_fclose(&file); + send_http_error(conn, + 500, + "Error: Can not create file\nfopen(%s): %s", + path, + strerror(ERRNO)); + return; + } + + fclose_on_exec(&file, conn); + range = mg_get_header(conn, "Content-Range"); + r1 = r2 = 0; + if (range != NULL && parse_range_header(range, &r1, &r2) > 0) { + conn->status_code = 206; /* Partial content */ + fseeko(file.fp, r1, SEEK_SET); + } + + if (!forward_body_data(conn, file.fp, INVALID_SOCKET, NULL)) { + /* forward_body_data failed. + * The error code has already been sent to the client, + * and conn->status_code is already set. */ + mg_fclose(&file); + return; + } + + gmt_time_string(date, sizeof(date), &curtime); + mg_printf(conn, + "HTTP/1.1 %d %s\r\n", + conn->status_code, + mg_get_response_code_text(NULL, conn->status_code)); + send_no_cache_header(conn); + mg_printf(conn, + "Date: %s\r\n" + "Content-Length: 0\r\n" + "Connection: %s\r\n\r\n", + date, + suggest_connection_header(conn)); + + mg_fclose(&file); +} + + +static void +delete_file(struct mg_connection *conn, const char *path) +{ + struct de de; + memset(&de.file, 0, sizeof(de.file)); + if (!mg_stat(conn, path, &de.file)) { + /* mg_stat returns 0 if the file does not exist */ + send_http_error(conn, + 404, + "Error: Cannot delete file\nFile %s not found", + path); + return; + } + + if (de.file.membuf != NULL) { + /* the file is cached in memory */ + send_http_error( + conn, + 405, + "Error: Delete not possible\nDeleting %s is not supported", + path); + return; + } + + if (de.file.is_directory) { + if (remove_directory(conn, path)) { + /* Delete is successful: Return 204 without content. */ + send_http_error(conn, 204, "%s", ""); + } else { + /* Delete is not successful: Return 500 (Server error). */ + send_http_error(conn, 500, "Error: Could not delete %s", path); + } + return; + } + + /* This is an existing file (not a directory). + * Check if write permission is granted. */ + if (access(path, W_OK) != 0) { + /* File is read only */ + send_http_error( + conn, + 403, + "Error: Delete not possible\nDeleting %s is not allowed", + path); + return; + } + + /* Try to delete it. */ + if (mg_remove(conn, path) == 0) { + /* Delete was successful: Return 204 without content. */ + send_http_error(conn, 204, "%s", ""); + } else { + /* Delete not successful (file locked). */ + send_http_error(conn, + 423, + "Error: Cannot delete file\nremove(%s): %s", + path, + strerror(ERRNO)); + } +} +#endif /* !NO_FILES */ + + +static void +send_ssi_file(struct mg_connection *, const char *, struct file *, int); + + +static void +do_ssi_include(struct mg_connection *conn, + const char *ssi, + char *tag, + int include_level) +{ + char file_name[MG_BUF_LEN], path[512], *p; + struct file file = STRUCT_FILE_INITIALIZER; + size_t len; + int truncated = 0; + + if (conn == NULL) { + return; + } + + /* sscanf() is safe here, since send_ssi_file() also uses buffer + * of size MG_BUF_LEN to get the tag. So strlen(tag) is + * always < MG_BUF_LEN. */ + if (sscanf(tag, " virtual=\"%511[^\"]\"", file_name) == 1) { + /* File name is relative to the webserver root */ + file_name[511] = 0; + (void)mg_snprintf(conn, + &truncated, + path, + sizeof(path), + "%s/%s", + conn->ctx->config[DOCUMENT_ROOT], + file_name); + + } else if (sscanf(tag, " abspath=\"%511[^\"]\"", file_name) == 1) { + /* File name is relative to the webserver working directory + * or it is absolute system path */ + file_name[511] = 0; + (void) + mg_snprintf(conn, &truncated, path, sizeof(path), "%s", file_name); + + } else if (sscanf(tag, " file=\"%511[^\"]\"", file_name) == 1 + || sscanf(tag, " \"%511[^\"]\"", file_name) == 1) { + /* File name is relative to the currect document */ + file_name[511] = 0; + (void)mg_snprintf(conn, &truncated, path, sizeof(path), "%s", ssi); + + if (!truncated) { + if ((p = strrchr(path, '/')) != NULL) { + p[1] = '\0'; + } + len = strlen(path); + (void)mg_snprintf(conn, + &truncated, + path + len, + sizeof(path) - len, + "%s", + file_name); + } + + } else { + mg_cry(conn, "Bad SSI #include: [%s]", tag); + return; + } + + if (truncated) { + mg_cry(conn, "SSI #include path length overflow: [%s]", tag); + return; + } + + if (!mg_fopen(conn, path, "rb", &file)) { + mg_cry(conn, + "Cannot open SSI #include: [%s]: fopen(%s): %s", + tag, + path, + strerror(ERRNO)); + } else { + fclose_on_exec(&file, conn); + if (match_prefix(conn->ctx->config[SSI_EXTENSIONS], + strlen(conn->ctx->config[SSI_EXTENSIONS]), + path) > 0) { + send_ssi_file(conn, path, &file, include_level + 1); + } else { + send_file_data(conn, &file, 0, INT64_MAX); + } + mg_fclose(&file); + } +} + + +#if !defined(NO_POPEN) +static void +do_ssi_exec(struct mg_connection *conn, char *tag) +{ + char cmd[1024] = ""; + struct file file = STRUCT_FILE_INITIALIZER; + + if (sscanf(tag, " \"%1023[^\"]\"", cmd) != 1) { + mg_cry(conn, "Bad SSI #exec: [%s]", tag); + } else { + cmd[1023] = 0; + if ((file.fp = popen(cmd, "r")) == NULL) { + mg_cry(conn, "Cannot SSI #exec: [%s]: %s", cmd, strerror(ERRNO)); + } else { + send_file_data(conn, &file, 0, INT64_MAX); + pclose(file.fp); + } + } +} +#endif /* !NO_POPEN */ + + +static int +mg_fgetc(struct file *filep, int offset) +{ + if (filep == NULL) { + return EOF; + } + if (filep->membuf != NULL && offset >= 0 + && ((unsigned int)(offset)) < filep->size) { + return ((const unsigned char *)filep->membuf)[offset]; + } else if (filep->fp != NULL) { + return fgetc(filep->fp); + } else { + return EOF; + } +} + + +static void +send_ssi_file(struct mg_connection *conn, + const char *path, + struct file *filep, + int include_level) +{ + char buf[MG_BUF_LEN]; + int ch, offset, len, in_ssi_tag; + + if (include_level > 10) { + mg_cry(conn, "SSI #include level is too deep (%s)", path); + return; + } + + in_ssi_tag = len = offset = 0; + while ((ch = mg_fgetc(filep, offset)) != EOF) { + if (in_ssi_tag && ch == '>') { + in_ssi_tag = 0; + buf[len++] = (char)ch; + buf[len] = '\0'; + /* assert(len <= (int) sizeof(buf)); */ + if (len > (int)sizeof(buf)) { + break; + } + if (len < 6 || memcmp(buf, " + + + EnvironmentId + {666f325e-a9c7-45d6-a820-626289f99bab} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + false + 80 + true + true + 1 + true + false + 0 + true + true + 0 + 8 + true + 1 + true + true + true + false + + + + ProjectExplorer.Project.PluginSettings + + + true + Builtin.Questionable + + true + Builtin.DefaultTidyAndClazy + 2 + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop Qt 5.12.9 GCC 64bit + Desktop Qt 5.12.9 GCC 64bit + qt.qt5.5129.gcc_64_kit + 0 + 0 + 0 + + true + 0 + /home/panda/build-Hiperiso2Disk-Desktop_Qt_5_12_9_GCC_64bit-Debug + /home/panda/build-Hiperiso2Disk-Desktop_Qt_5_12_9_GCC_64bit-Debug + + + true + QtProjectManager.QMakeBuildStep + + false + + + + true + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Debug + Qt4ProjectManager.Qt4BuildConfiguration + 2 + 2 + 2 + + + true + 2 + /home/panda/build-Hiperiso2Disk-Desktop_Qt_5_12_9_GCC_64bit-Release + /home/panda/build-Hiperiso2Disk-Desktop_Qt_5_12_9_GCC_64bit-Release + + + true + QtProjectManager.QMakeBuildStep + + false + + + + true + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Release + Qt4ProjectManager.Qt4BuildConfiguration + 0 + 0 + 2 + + + true + 0 + /home/panda/build-Hiperiso2Disk-Desktop_Qt_5_12_9_GCC_64bit-Profile + /home/panda/build-Hiperiso2Disk-Desktop_Qt_5_12_9_GCC_64bit-Profile + + + true + QtProjectManager.QMakeBuildStep + + false + + + + true + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Profile + Qt4ProjectManager.Qt4BuildConfiguration + 0 + 0 + 0 + + 3 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + Qt4ProjectManager.Qt4RunConfiguration:/home/panda/Hiperiso2Disk/Hiperiso2Disk.pro + /home/panda/Hiperiso2Disk/Hiperiso2Disk.pro + + false + + false + true + true + false + false + true + /home/panda/Desktop/hiperiso-1.0.52-linux/hiperiso-1.0.52 + /home/panda/build-Hiperiso2Disk-Desktop_Qt_5_12_9_GCC_64bit-Debug + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/src/gui/QT/Makefile b/src/gui/QT/Makefile new file mode 100644 index 0000000..7d1106b --- /dev/null +++ b/src/gui/QT/Makefile @@ -0,0 +1,1081 @@ +############################################################################# +# Makefile for building: Hiperiso2Disk +# Generated by qmake (3.1) (Qt 5.15.19) +# Project: Hiperiso2Disk.pro +# Template: app +# Command: /usr/bin/qmake-qt5 -o Makefile Hiperiso2Disk.pro +############################################################################# + +MAKEFILE = Makefile + +EQ = = + +####### Compiler, tools and options + +CC = gcc +CXX = g++ +DEFINES = -DQT_DEPRECATED_WARNINGS -DSTATIC=static -DINIT= -DQT_CHECK_EUID -D_FILE_OFFSET_BITS=64 -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB +CFLAGS = -pipe -O2 -flto -fno-fat-lto-objects -Wall -Wextra -D_REENTRANT -fPIC $(DEFINES) +CXXFLAGS = -pipe -O2 -std=gnu++11 -flto -fno-fat-lto-objects -Wall -Wextra -D_REENTRANT -fPIC $(DEFINES) +INCPATH = -I. -I../Core -I../Web -I. -I../Include -I../Lib/libhttp/include -I/mnt/data/Builds/hiperiso/src/gui/QT/../Lib/fat_io_lib/include -I../Lib/xz-embedded/linux/include -I../Lib/xz-embedded/linux/include/linux -I../Lib/xz-embedded/userspace -I../Lib/exfat/src/libexfat -I../Lib/fat_io_lib -I/usr/include/qt -I/usr/include/qt/QtWidgets -I/usr/include/qt/QtGui -I/usr/include/qt/QtCore -I. -I. -I/usr/lib/qt/mkspecs/linux-g++ +QMAKE = /usr/bin/qmake-qt5 +DEL_FILE = rm -f +CHK_DIR_EXISTS= test -d +MKDIR = mkdir -p +COPY = cp -f +COPY_FILE = cp -f +COPY_DIR = cp -f -R +INSTALL_FILE = install -m 644 -p +INSTALL_PROGRAM = install -m 755 -p +INSTALL_DIR = cp -f -R +QINSTALL = /usr/bin/qmake-qt5 -install qinstall +QINSTALL_PROGRAM = /usr/bin/qmake-qt5 -install qinstall -exe +DEL_FILE = rm -f +SYMLINK = ln -f -s +DEL_DIR = rmdir +MOVE = mv -f +TAR = tar -cf +COMPRESS = gzip -9f +DISTNAME = Hiperiso2Disk1.0.0 +DISTDIR = /mnt/data/Builds/hiperiso/src/gui/QT/.tmp/Hiperiso2Disk1.0.0 +LINK = g++ +LFLAGS = -Wl,-O1 -pipe -O2 -std=gnu++11 -flto=16 -fno-fat-lto-objects -fuse-linker-plugin -fPIC +LIBS = $(SUBLIBS) /usr/lib/libQt5Widgets.so /usr/lib/libQt5Gui.so /usr/lib/libQt5Core.so -lGL -lpthread +AR = gcc-ar cqs +RANLIB = +SED = sed +STRIP = strip + +####### Output directory + +OBJECTS_DIR = ./ + +####### Files + +SOURCES = ../Core/hiperiso_crc32.c \ + ../Core/hiperiso_disk.c \ + ../Core/hiperiso_json.c \ + ../Core/hiperiso_log.c \ + ../Core/hiperiso_md5.c \ + ../Core/hiperiso_util.c \ + ../Lib/exfat/src/libexfat/cluster.c \ + ../Lib/exfat/src/libexfat/io.c \ + ../Lib/exfat/src/libexfat/lookup.c \ + ../Lib/exfat/src/libexfat/mount.c \ + ../Lib/exfat/src/libexfat/node.c \ + ../Lib/exfat/src/libexfat/repair.c \ + ../Lib/exfat/src/libexfat/time.c \ + ../Lib/exfat/src/libexfat/utf.c \ + ../Lib/exfat/src/libexfat/utils.c \ + ../Lib/exfat/src/mkfs/cbm.c \ + ../Lib/exfat/src/mkfs/fat.c \ + ../Lib/exfat/src/mkfs/mkexfat.c \ + ../Lib/exfat/src/mkfs/mkexfat_main.c \ + ../Lib/exfat/src/mkfs/rootdir.c \ + ../Lib/exfat/src/mkfs/uct.c \ + ../Lib/exfat/src/mkfs/uctc.c \ + ../Lib/exfat/src/mkfs/vbr.c \ + ../Lib/fat_io_lib/fat_access.c \ + ../Lib/fat_io_lib/fat_cache.c \ + ../Lib/fat_io_lib/fat_filelib.c \ + ../Lib/fat_io_lib/fat_format.c \ + ../Lib/fat_io_lib/fat_misc.c \ + ../Lib/fat_io_lib/fat_string.c \ + ../Lib/fat_io_lib/fat_table.c \ + ../Lib/fat_io_lib/fat_write.c \ + ../Lib/xz-embedded/linux/lib/decompress_unxz.c \ + refresh_icon_data.c \ + secure_icon_data.c \ + hiperiso_qt_stub.c \ + ../Web/hiperiso_http.c \ + main.cpp \ + partcfgdialog.cpp \ + hiperiso2diskwindow.cpp moc_partcfgdialog.cpp \ + moc_hiperiso2diskwindow.cpp +OBJECTS = hiperiso_crc32.o \ + hiperiso_disk.o \ + hiperiso_json.o \ + hiperiso_log.o \ + hiperiso_md5.o \ + hiperiso_util.o \ + cluster.o \ + io.o \ + lookup.o \ + mount.o \ + node.o \ + repair.o \ + time.o \ + utf.o \ + utils.o \ + cbm.o \ + fat.o \ + mkexfat.o \ + mkexfat_main.o \ + rootdir.o \ + uct.o \ + uctc.o \ + vbr.o \ + fat_access.o \ + fat_cache.o \ + fat_filelib.o \ + fat_format.o \ + fat_misc.o \ + fat_string.o \ + fat_table.o \ + fat_write.o \ + decompress_unxz.o \ + refresh_icon_data.o \ + secure_icon_data.o \ + hiperiso_qt_stub.o \ + hiperiso_http.o \ + main.o \ + partcfgdialog.o \ + hiperiso2diskwindow.o \ + moc_partcfgdialog.o \ + moc_hiperiso2diskwindow.o +DIST = Lib/fat_io_lib/API.txt \ + Lib/fat_io_lib/COPYRIGHT.txt \ + Lib/fat_io_lib/Configuration.txt \ + Lib/fat_io_lib/History.txt \ + Lib/fat_io_lib/License.txt \ + Lib/fat_io_lib/Media \ + Access \ + API.txt \ + Lib/fat_io_lib/version.txt \ + /usr/lib/qt/mkspecs/features/spec_pre.prf \ + /usr/lib/qt/mkspecs/common/unix.conf \ + /usr/lib/qt/mkspecs/common/linux.conf \ + /usr/lib/qt/mkspecs/common/sanitize.conf \ + /usr/lib/qt/mkspecs/common/gcc-base.conf \ + /usr/lib/qt/mkspecs/common/gcc-base-unix.conf \ + /usr/lib/qt/mkspecs/common/g++-base.conf \ + /usr/lib/qt/mkspecs/common/g++-unix.conf \ + /usr/lib/qt/mkspecs/qconfig.pri \ + /usr/lib/qt/mkspecs/modules/qt_KArchive.pri \ + /usr/lib/qt/mkspecs/modules/qt_KAuth.pri \ + /usr/lib/qt/mkspecs/modules/qt_KAuthCore.pri \ + /usr/lib/qt/mkspecs/modules/qt_KCodecs.pri \ + /usr/lib/qt/mkspecs/modules/qt_KCompletion.pri \ + /usr/lib/qt/mkspecs/modules/qt_KConfigCore.pri \ + /usr/lib/qt/mkspecs/modules/qt_KConfigGui.pri \ + /usr/lib/qt/mkspecs/modules/qt_KConfigWidgets.pri \ + /usr/lib/qt/mkspecs/modules/qt_KCoreAddons.pri \ + /usr/lib/qt/mkspecs/modules/qt_KCrash.pri \ + /usr/lib/qt/mkspecs/modules/qt_KGuiAddons.pri \ + /usr/lib/qt/mkspecs/modules/qt_KI18n.pri \ + /usr/lib/qt/mkspecs/modules/qt_KIconThemes.pri \ + /usr/lib/qt/mkspecs/modules/qt_Kirigami2.pri \ + /usr/lib/qt/mkspecs/modules/qt_KItemModels.pri \ + /usr/lib/qt/mkspecs/modules/qt_KItemViews.pri \ + /usr/lib/qt/mkspecs/modules/qt_KNotifications.pri \ + /usr/lib/qt/mkspecs/modules/qt_KWaylandClient.pri \ + /usr/lib/qt/mkspecs/modules/qt_KWaylandServer.pri \ + /usr/lib/qt/mkspecs/modules/qt_KWidgetsAddons.pri \ + /usr/lib/qt/mkspecs/modules/qt_KWindowSystem.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_accessibility_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_bootstrap_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_concurrent.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_concurrent_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_core.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_core_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_dbus.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_dbus_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_devicediscovery_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_edid_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_egl_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_eglfs_kms_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_eventdispatcher_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_fb_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_fontdatabase_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_glx_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_gui.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_gui_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_input_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_kms_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_linuxaccessibility_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_multimedia.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_multimedia_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_multimediagsttools_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_multimediawidgets.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_multimediawidgets_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_network.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_network_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_opengl.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_opengl_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_openglextensions.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_openglextensions_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_packetprotocol_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_platformcompositor_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_printsupport.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_printsupport_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qml.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qml_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmldebug_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmldevtools_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmlmodels.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmlmodels_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmltest.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmltest_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmlworkerscript.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmlworkerscript_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quick.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quick_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quickcontrols2.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quickcontrols2_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quickparticles_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quickshapes_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quicktemplates2.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quicktemplates2_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quickwidgets.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quickwidgets_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_service_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_sql.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_sql_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_svg.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_svg_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_testlib.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_testlib_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_texttospeech.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_texttospeech_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_theme_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_vulkan_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_waylandclient.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_waylandclient_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_waylandcompositor.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_waylandcompositor_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_widgets.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_widgets_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_x11extras.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_x11extras_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_xkbcommon_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_xml.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_xml_private.pri \ + /usr/lib/qt/mkspecs/features/qt_functions.prf \ + /usr/lib/qt/mkspecs/features/qt_config.prf \ + /usr/lib/qt/mkspecs/linux-g++/qmake.conf \ + /usr/lib/qt/mkspecs/features/spec_post.prf \ + .qmake.stash \ + /usr/lib/qt/mkspecs/features/exclusive_builds.prf \ + /usr/lib/qt/mkspecs/features/toolchain.prf \ + /usr/lib/qt/mkspecs/features/default_pre.prf \ + /usr/lib/qt/mkspecs/features/resolve_config.prf \ + /usr/lib/qt/mkspecs/features/default_post.prf \ + /usr/lib/qt/mkspecs/features/link_ltcg.prf \ + /usr/lib/qt/mkspecs/features/ltcg.prf \ + /usr/lib/qt/mkspecs/features/warn_on.prf \ + /usr/lib/qt/mkspecs/features/qt.prf \ + /usr/lib/qt/mkspecs/features/resources_functions.prf \ + /usr/lib/qt/mkspecs/features/resources.prf \ + /usr/lib/qt/mkspecs/features/moc.prf \ + /usr/lib/qt/mkspecs/features/unix/opengl.prf \ + /usr/lib/qt/mkspecs/features/uic.prf \ + /usr/lib/qt/mkspecs/features/unix/thread.prf \ + /usr/lib/qt/mkspecs/features/qmake_use.prf \ + /usr/lib/qt/mkspecs/features/file_copies.prf \ + /usr/lib/qt/mkspecs/features/testcase_targets.prf \ + /usr/lib/qt/mkspecs/features/exceptions.prf \ + /usr/lib/qt/mkspecs/features/yacc.prf \ + /usr/lib/qt/mkspecs/features/lex.prf \ + Hiperiso2Disk.pro ../Core/hiperiso_define.h \ + ../Core/hiperiso_disk.h \ + ../Core/hiperiso_json.h \ + ../Core/hiperiso_util.h \ + ../Include/Hiperiso2Disk.h \ + ../Lib/exfat/src/libexfat/byteorder.h \ + ../Lib/exfat/src/libexfat/compiler.h \ + ../Lib/exfat/src/libexfat/config.h \ + ../Lib/exfat/src/libexfat/exfat.h \ + ../Lib/exfat/src/libexfat/exfatfs.h \ + ../Lib/exfat/src/libexfat/platform.h \ + ../Lib/exfat/src/mkfs/cbm.h \ + ../Lib/exfat/src/mkfs/fat.h \ + ../Lib/exfat/src/mkfs/mkexfat.h \ + ../Lib/exfat/src/mkfs/rootdir.h \ + ../Lib/exfat/src/mkfs/uct.h \ + ../Lib/exfat/src/mkfs/uctc.h \ + ../Lib/exfat/src/mkfs/vbr.h \ + ../Lib/fat_io_lib/fat_access.h \ + ../Lib/fat_io_lib/fat_cache.h \ + ../Lib/fat_io_lib/fat_defs.h \ + ../Lib/fat_io_lib/fat_filelib.h \ + ../Lib/fat_io_lib/fat_format.h \ + ../Lib/fat_io_lib/fat_list.h \ + ../Lib/fat_io_lib/fat_misc.h \ + ../Lib/fat_io_lib/fat_opts.h \ + ../Lib/fat_io_lib/fat_string.h \ + ../Lib/fat_io_lib/fat_table.h \ + ../Lib/fat_io_lib/fat_types.h \ + ../Lib/fat_io_lib/fat_write.h \ + ../Lib/libhttp/include/civetweb.h \ + ../Lib/libhttp/include/handle_form.inl \ + ../Lib/libhttp/include/md5.inl \ + ../Lib/libhttp/include/mod_duktape.inl \ + ../Lib/libhttp/include/mod_lua.inl \ + ../Lib/libhttp/include/timer.inl \ + hiperiso_qt.h \ + ../Web/hiperiso_http.h \ + partcfgdialog.h \ + hiperiso2diskwindow.h ../Core/hiperiso_crc32.c \ + ../Core/hiperiso_disk.c \ + ../Core/hiperiso_json.c \ + ../Core/hiperiso_log.c \ + ../Core/hiperiso_md5.c \ + ../Core/hiperiso_util.c \ + ../Lib/exfat/src/libexfat/cluster.c \ + ../Lib/exfat/src/libexfat/io.c \ + ../Lib/exfat/src/libexfat/lookup.c \ + ../Lib/exfat/src/libexfat/mount.c \ + ../Lib/exfat/src/libexfat/node.c \ + ../Lib/exfat/src/libexfat/repair.c \ + ../Lib/exfat/src/libexfat/time.c \ + ../Lib/exfat/src/libexfat/utf.c \ + ../Lib/exfat/src/libexfat/utils.c \ + ../Lib/exfat/src/mkfs/cbm.c \ + ../Lib/exfat/src/mkfs/fat.c \ + ../Lib/exfat/src/mkfs/mkexfat.c \ + ../Lib/exfat/src/mkfs/mkexfat_main.c \ + ../Lib/exfat/src/mkfs/rootdir.c \ + ../Lib/exfat/src/mkfs/uct.c \ + ../Lib/exfat/src/mkfs/uctc.c \ + ../Lib/exfat/src/mkfs/vbr.c \ + ../Lib/fat_io_lib/fat_access.c \ + ../Lib/fat_io_lib/fat_cache.c \ + ../Lib/fat_io_lib/fat_filelib.c \ + ../Lib/fat_io_lib/fat_format.c \ + ../Lib/fat_io_lib/fat_misc.c \ + ../Lib/fat_io_lib/fat_string.c \ + ../Lib/fat_io_lib/fat_table.c \ + ../Lib/fat_io_lib/fat_write.c \ + ../Lib/xz-embedded/linux/lib/decompress_unxz.c \ + refresh_icon_data.c \ + secure_icon_data.c \ + hiperiso_qt_stub.c \ + ../Web/hiperiso_http.c \ + main.cpp \ + partcfgdialog.cpp \ + hiperiso2diskwindow.cpp +QMAKE_TARGET = Hiperiso2Disk +DESTDIR = +TARGET = Hiperiso2Disk + + +first: all +####### Build rules + +Hiperiso2Disk: ui_partcfgdialog.h ui_hiperiso2diskwindow.h $(OBJECTS) + $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS) + +Makefile: Hiperiso2Disk.pro /usr/lib/qt/mkspecs/linux-g++/qmake.conf /usr/lib/qt/mkspecs/features/spec_pre.prf \ + /usr/lib/qt/mkspecs/common/unix.conf \ + /usr/lib/qt/mkspecs/common/linux.conf \ + /usr/lib/qt/mkspecs/common/sanitize.conf \ + /usr/lib/qt/mkspecs/common/gcc-base.conf \ + /usr/lib/qt/mkspecs/common/gcc-base-unix.conf \ + /usr/lib/qt/mkspecs/common/g++-base.conf \ + /usr/lib/qt/mkspecs/common/g++-unix.conf \ + /usr/lib/qt/mkspecs/qconfig.pri \ + /usr/lib/qt/mkspecs/modules/qt_KArchive.pri \ + /usr/lib/qt/mkspecs/modules/qt_KAuth.pri \ + /usr/lib/qt/mkspecs/modules/qt_KAuthCore.pri \ + /usr/lib/qt/mkspecs/modules/qt_KCodecs.pri \ + /usr/lib/qt/mkspecs/modules/qt_KCompletion.pri \ + /usr/lib/qt/mkspecs/modules/qt_KConfigCore.pri \ + /usr/lib/qt/mkspecs/modules/qt_KConfigGui.pri \ + /usr/lib/qt/mkspecs/modules/qt_KConfigWidgets.pri \ + /usr/lib/qt/mkspecs/modules/qt_KCoreAddons.pri \ + /usr/lib/qt/mkspecs/modules/qt_KCrash.pri \ + /usr/lib/qt/mkspecs/modules/qt_KGuiAddons.pri \ + /usr/lib/qt/mkspecs/modules/qt_KI18n.pri \ + /usr/lib/qt/mkspecs/modules/qt_KIconThemes.pri \ + /usr/lib/qt/mkspecs/modules/qt_Kirigami2.pri \ + /usr/lib/qt/mkspecs/modules/qt_KItemModels.pri \ + /usr/lib/qt/mkspecs/modules/qt_KItemViews.pri \ + /usr/lib/qt/mkspecs/modules/qt_KNotifications.pri \ + /usr/lib/qt/mkspecs/modules/qt_KWaylandClient.pri \ + /usr/lib/qt/mkspecs/modules/qt_KWaylandServer.pri \ + /usr/lib/qt/mkspecs/modules/qt_KWidgetsAddons.pri \ + /usr/lib/qt/mkspecs/modules/qt_KWindowSystem.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_accessibility_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_bootstrap_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_concurrent.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_concurrent_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_core.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_core_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_dbus.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_dbus_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_devicediscovery_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_edid_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_egl_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_eglfs_kms_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_eventdispatcher_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_fb_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_fontdatabase_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_glx_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_gui.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_gui_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_input_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_kms_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_linuxaccessibility_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_multimedia.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_multimedia_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_multimediagsttools_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_multimediawidgets.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_multimediawidgets_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_network.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_network_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_opengl.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_opengl_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_openglextensions.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_openglextensions_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_packetprotocol_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_platformcompositor_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_printsupport.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_printsupport_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qml.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qml_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmldebug_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmldevtools_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmlmodels.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmlmodels_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmltest.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmltest_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmlworkerscript.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmlworkerscript_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quick.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quick_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quickcontrols2.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quickcontrols2_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quickparticles_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quickshapes_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quicktemplates2.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quicktemplates2_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quickwidgets.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quickwidgets_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_service_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_sql.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_sql_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_svg.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_svg_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_testlib.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_testlib_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_texttospeech.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_texttospeech_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_theme_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_vulkan_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_waylandclient.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_waylandclient_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_waylandcompositor.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_waylandcompositor_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_widgets.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_widgets_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_x11extras.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_x11extras_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_xkbcommon_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_xml.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_xml_private.pri \ + /usr/lib/qt/mkspecs/features/qt_functions.prf \ + /usr/lib/qt/mkspecs/features/qt_config.prf \ + /usr/lib/qt/mkspecs/linux-g++/qmake.conf \ + /usr/lib/qt/mkspecs/features/spec_post.prf \ + .qmake.stash \ + /usr/lib/qt/mkspecs/features/exclusive_builds.prf \ + /usr/lib/qt/mkspecs/features/toolchain.prf \ + /usr/lib/qt/mkspecs/features/default_pre.prf \ + /usr/lib/qt/mkspecs/features/resolve_config.prf \ + /usr/lib/qt/mkspecs/features/default_post.prf \ + /usr/lib/qt/mkspecs/features/link_ltcg.prf \ + /usr/lib/qt/mkspecs/features/ltcg.prf \ + /usr/lib/qt/mkspecs/features/warn_on.prf \ + /usr/lib/qt/mkspecs/features/qt.prf \ + /usr/lib/qt/mkspecs/features/resources_functions.prf \ + /usr/lib/qt/mkspecs/features/resources.prf \ + /usr/lib/qt/mkspecs/features/moc.prf \ + /usr/lib/qt/mkspecs/features/unix/opengl.prf \ + /usr/lib/qt/mkspecs/features/uic.prf \ + /usr/lib/qt/mkspecs/features/unix/thread.prf \ + /usr/lib/qt/mkspecs/features/qmake_use.prf \ + /usr/lib/qt/mkspecs/features/file_copies.prf \ + /usr/lib/qt/mkspecs/features/testcase_targets.prf \ + /usr/lib/qt/mkspecs/features/exceptions.prf \ + /usr/lib/qt/mkspecs/features/yacc.prf \ + /usr/lib/qt/mkspecs/features/lex.prf \ + Hiperiso2Disk.pro + $(QMAKE) -o Makefile Hiperiso2Disk.pro +/usr/lib/qt/mkspecs/features/spec_pre.prf: +/usr/lib/qt/mkspecs/common/unix.conf: +/usr/lib/qt/mkspecs/common/linux.conf: +/usr/lib/qt/mkspecs/common/sanitize.conf: +/usr/lib/qt/mkspecs/common/gcc-base.conf: +/usr/lib/qt/mkspecs/common/gcc-base-unix.conf: +/usr/lib/qt/mkspecs/common/g++-base.conf: +/usr/lib/qt/mkspecs/common/g++-unix.conf: +/usr/lib/qt/mkspecs/qconfig.pri: +/usr/lib/qt/mkspecs/modules/qt_KArchive.pri: +/usr/lib/qt/mkspecs/modules/qt_KAuth.pri: +/usr/lib/qt/mkspecs/modules/qt_KAuthCore.pri: +/usr/lib/qt/mkspecs/modules/qt_KCodecs.pri: +/usr/lib/qt/mkspecs/modules/qt_KCompletion.pri: +/usr/lib/qt/mkspecs/modules/qt_KConfigCore.pri: +/usr/lib/qt/mkspecs/modules/qt_KConfigGui.pri: +/usr/lib/qt/mkspecs/modules/qt_KConfigWidgets.pri: +/usr/lib/qt/mkspecs/modules/qt_KCoreAddons.pri: +/usr/lib/qt/mkspecs/modules/qt_KCrash.pri: +/usr/lib/qt/mkspecs/modules/qt_KGuiAddons.pri: +/usr/lib/qt/mkspecs/modules/qt_KI18n.pri: +/usr/lib/qt/mkspecs/modules/qt_KIconThemes.pri: +/usr/lib/qt/mkspecs/modules/qt_Kirigami2.pri: +/usr/lib/qt/mkspecs/modules/qt_KItemModels.pri: +/usr/lib/qt/mkspecs/modules/qt_KItemViews.pri: +/usr/lib/qt/mkspecs/modules/qt_KNotifications.pri: +/usr/lib/qt/mkspecs/modules/qt_KWaylandClient.pri: +/usr/lib/qt/mkspecs/modules/qt_KWaylandServer.pri: +/usr/lib/qt/mkspecs/modules/qt_KWidgetsAddons.pri: +/usr/lib/qt/mkspecs/modules/qt_KWindowSystem.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_accessibility_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_bootstrap_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_concurrent.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_concurrent_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_core.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_core_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_dbus.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_dbus_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_devicediscovery_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_edid_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_egl_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_eglfs_kms_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_eventdispatcher_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_fb_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_fontdatabase_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_glx_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_gui.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_gui_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_input_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_kms_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_linuxaccessibility_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_multimedia.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_multimedia_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_multimediagsttools_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_multimediawidgets.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_multimediawidgets_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_network.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_network_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_opengl.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_opengl_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_openglextensions.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_openglextensions_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_packetprotocol_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_platformcompositor_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_printsupport.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_printsupport_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_qml.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_qml_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_qmldebug_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_qmldevtools_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_qmlmodels.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_qmlmodels_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_qmltest.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_qmltest_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_qmlworkerscript.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_qmlworkerscript_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_quick.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_quick_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_quickcontrols2.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_quickcontrols2_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_quickparticles_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_quickshapes_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_quicktemplates2.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_quicktemplates2_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_quickwidgets.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_quickwidgets_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_service_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_sql.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_sql_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_svg.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_svg_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_testlib.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_testlib_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_texttospeech.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_texttospeech_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_theme_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_vulkan_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_waylandclient.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_waylandclient_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_waylandcompositor.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_waylandcompositor_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_widgets.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_widgets_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_x11extras.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_x11extras_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_xkbcommon_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_xml.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_xml_private.pri: +/usr/lib/qt/mkspecs/features/qt_functions.prf: +/usr/lib/qt/mkspecs/features/qt_config.prf: +/usr/lib/qt/mkspecs/linux-g++/qmake.conf: +/usr/lib/qt/mkspecs/features/spec_post.prf: +.qmake.stash: +/usr/lib/qt/mkspecs/features/exclusive_builds.prf: +/usr/lib/qt/mkspecs/features/toolchain.prf: +/usr/lib/qt/mkspecs/features/default_pre.prf: +/usr/lib/qt/mkspecs/features/resolve_config.prf: +/usr/lib/qt/mkspecs/features/default_post.prf: +/usr/lib/qt/mkspecs/features/link_ltcg.prf: +/usr/lib/qt/mkspecs/features/ltcg.prf: +/usr/lib/qt/mkspecs/features/warn_on.prf: +/usr/lib/qt/mkspecs/features/qt.prf: +/usr/lib/qt/mkspecs/features/resources_functions.prf: +/usr/lib/qt/mkspecs/features/resources.prf: +/usr/lib/qt/mkspecs/features/moc.prf: +/usr/lib/qt/mkspecs/features/unix/opengl.prf: +/usr/lib/qt/mkspecs/features/uic.prf: +/usr/lib/qt/mkspecs/features/unix/thread.prf: +/usr/lib/qt/mkspecs/features/qmake_use.prf: +/usr/lib/qt/mkspecs/features/file_copies.prf: +/usr/lib/qt/mkspecs/features/testcase_targets.prf: +/usr/lib/qt/mkspecs/features/exceptions.prf: +/usr/lib/qt/mkspecs/features/yacc.prf: +/usr/lib/qt/mkspecs/features/lex.prf: +Hiperiso2Disk.pro: +qmake: FORCE + @$(QMAKE) -o Makefile Hiperiso2Disk.pro + +qmake_all: FORCE + + +all: Makefile Hiperiso2Disk + +dist: distdir FORCE + (cd `dirname $(DISTDIR)` && $(TAR) $(DISTNAME).tar $(DISTNAME) && $(COMPRESS) $(DISTNAME).tar) && $(MOVE) `dirname $(DISTDIR)`/$(DISTNAME).tar.gz . && $(DEL_FILE) -r $(DISTDIR) + +distdir: FORCE + @test -d $(DISTDIR) || mkdir -p $(DISTDIR) + $(COPY_FILE) --parents $(DIST) $(DISTDIR)/ + $(COPY_FILE) --parents /usr/lib/qt/mkspecs/features/data/dummy.cpp $(DISTDIR)/ + $(COPY_FILE) --parents ../Core/hiperiso_define.h ../Core/hiperiso_disk.h ../Core/hiperiso_json.h ../Core/hiperiso_util.h ../Include/Hiperiso2Disk.h ../Lib/exfat/src/libexfat/byteorder.h ../Lib/exfat/src/libexfat/compiler.h ../Lib/exfat/src/libexfat/config.h ../Lib/exfat/src/libexfat/exfat.h ../Lib/exfat/src/libexfat/exfatfs.h ../Lib/exfat/src/libexfat/platform.h ../Lib/exfat/src/mkfs/cbm.h ../Lib/exfat/src/mkfs/fat.h ../Lib/exfat/src/mkfs/mkexfat.h ../Lib/exfat/src/mkfs/rootdir.h ../Lib/exfat/src/mkfs/uct.h ../Lib/exfat/src/mkfs/uctc.h ../Lib/exfat/src/mkfs/vbr.h ../Lib/fat_io_lib/fat_access.h ../Lib/fat_io_lib/fat_cache.h ../Lib/fat_io_lib/fat_defs.h ../Lib/fat_io_lib/fat_filelib.h ../Lib/fat_io_lib/fat_format.h ../Lib/fat_io_lib/fat_list.h ../Lib/fat_io_lib/fat_misc.h ../Lib/fat_io_lib/fat_opts.h ../Lib/fat_io_lib/fat_string.h ../Lib/fat_io_lib/fat_table.h ../Lib/fat_io_lib/fat_types.h ../Lib/fat_io_lib/fat_write.h ../Lib/libhttp/include/civetweb.h ../Lib/libhttp/include/handle_form.inl ../Lib/libhttp/include/md5.inl ../Lib/libhttp/include/mod_duktape.inl ../Lib/libhttp/include/mod_lua.inl ../Lib/libhttp/include/timer.inl hiperiso_qt.h ../Web/hiperiso_http.h partcfgdialog.h hiperiso2diskwindow.h $(DISTDIR)/ + $(COPY_FILE) --parents ../Core/hiperiso_crc32.c ../Core/hiperiso_disk.c ../Core/hiperiso_json.c ../Core/hiperiso_log.c ../Core/hiperiso_md5.c ../Core/hiperiso_util.c ../Lib/exfat/src/libexfat/cluster.c ../Lib/exfat/src/libexfat/io.c ../Lib/exfat/src/libexfat/lookup.c ../Lib/exfat/src/libexfat/mount.c ../Lib/exfat/src/libexfat/node.c ../Lib/exfat/src/libexfat/repair.c ../Lib/exfat/src/libexfat/time.c ../Lib/exfat/src/libexfat/utf.c ../Lib/exfat/src/libexfat/utils.c ../Lib/exfat/src/mkfs/cbm.c ../Lib/exfat/src/mkfs/fat.c ../Lib/exfat/src/mkfs/mkexfat.c ../Lib/exfat/src/mkfs/mkexfat_main.c ../Lib/exfat/src/mkfs/rootdir.c ../Lib/exfat/src/mkfs/uct.c ../Lib/exfat/src/mkfs/uctc.c ../Lib/exfat/src/mkfs/vbr.c ../Lib/fat_io_lib/fat_access.c ../Lib/fat_io_lib/fat_cache.c ../Lib/fat_io_lib/fat_filelib.c ../Lib/fat_io_lib/fat_format.c ../Lib/fat_io_lib/fat_misc.c ../Lib/fat_io_lib/fat_string.c ../Lib/fat_io_lib/fat_table.c ../Lib/fat_io_lib/fat_write.c ../Lib/xz-embedded/linux/lib/decompress_unxz.c refresh_icon_data.c secure_icon_data.c hiperiso_qt_stub.c ../Web/hiperiso_http.c main.cpp partcfgdialog.cpp hiperiso2diskwindow.cpp $(DISTDIR)/ + $(COPY_FILE) --parents partcfgdialog.ui hiperiso2diskwindow.ui $(DISTDIR)/ + + +clean: compiler_clean + -$(DEL_FILE) $(OBJECTS) + -$(DEL_FILE) *~ core *.core + + +distclean: clean + -$(DEL_FILE) $(TARGET) + -$(DEL_FILE) .qmake.stash + -$(DEL_FILE) Makefile + + +####### Sub-libraries + +mocclean: compiler_moc_header_clean compiler_moc_objc_header_clean compiler_moc_source_clean + +mocables: compiler_moc_header_make_all compiler_moc_objc_header_make_all compiler_moc_source_make_all + +check: first + +benchmark: first + +compiler_rcc_make_all: +compiler_rcc_clean: +compiler_moc_predefs_make_all: moc_predefs.h +compiler_moc_predefs_clean: + -$(DEL_FILE) moc_predefs.h +moc_predefs.h: /usr/lib/qt/mkspecs/features/data/dummy.cpp + g++ -pipe -O2 -std=gnu++11 -flto -fno-fat-lto-objects -Wall -Wextra -dM -E -o moc_predefs.h /usr/lib/qt/mkspecs/features/data/dummy.cpp + +compiler_moc_header_make_all: moc_partcfgdialog.cpp moc_hiperiso2diskwindow.cpp +compiler_moc_header_clean: + -$(DEL_FILE) moc_partcfgdialog.cpp moc_hiperiso2diskwindow.cpp +moc_partcfgdialog.cpp: partcfgdialog.h \ + moc_predefs.h \ + /usr/bin/moc + /usr/bin/moc $(DEFINES) --include /mnt/data/Builds/hiperiso/src/gui/QT/moc_predefs.h -I/usr/lib/qt/mkspecs/linux-g++ -I/mnt/data/Builds/hiperiso/src/gui/QT -I/mnt/data/Builds/hiperiso/src/gui/Core -I/mnt/data/Builds/hiperiso/src/gui/Web -I/mnt/data/Builds/hiperiso/src/gui/QT -I/mnt/data/Builds/hiperiso/src/gui/Include -I/mnt/data/Builds/hiperiso/src/gui/Lib/libhttp/include -I/mnt/data/Builds/hiperiso/src/gui/Lib/fat_io_lib/include -I/mnt/data/Builds/hiperiso/src/gui/Lib/xz-embedded/linux/include -I/mnt/data/Builds/hiperiso/src/gui/Lib/xz-embedded/linux/include/linux -I/mnt/data/Builds/hiperiso/src/gui/Lib/xz-embedded/userspace -I/mnt/data/Builds/hiperiso/src/gui/Lib/exfat/src/libexfat -I/mnt/data/Builds/hiperiso/src/gui/Lib/fat_io_lib -I/usr/include/qt -I/usr/include/qt/QtWidgets -I/usr/include/qt/QtGui -I/usr/include/qt/QtCore -I/usr/include/c++/16.1.1 -I/usr/include/c++/16.1.1/x86_64-pc-linux-gnu -I/usr/include/c++/16.1.1/backward -I/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include -I/usr/local/include -I/usr/include partcfgdialog.h -o moc_partcfgdialog.cpp + +moc_hiperiso2diskwindow.cpp: hiperiso2diskwindow.h \ + partcfgdialog.h \ + moc_predefs.h \ + /usr/bin/moc + /usr/bin/moc $(DEFINES) --include /mnt/data/Builds/hiperiso/src/gui/QT/moc_predefs.h -I/usr/lib/qt/mkspecs/linux-g++ -I/mnt/data/Builds/hiperiso/src/gui/QT -I/mnt/data/Builds/hiperiso/src/gui/Core -I/mnt/data/Builds/hiperiso/src/gui/Web -I/mnt/data/Builds/hiperiso/src/gui/QT -I/mnt/data/Builds/hiperiso/src/gui/Include -I/mnt/data/Builds/hiperiso/src/gui/Lib/libhttp/include -I/mnt/data/Builds/hiperiso/src/gui/Lib/fat_io_lib/include -I/mnt/data/Builds/hiperiso/src/gui/Lib/xz-embedded/linux/include -I/mnt/data/Builds/hiperiso/src/gui/Lib/xz-embedded/linux/include/linux -I/mnt/data/Builds/hiperiso/src/gui/Lib/xz-embedded/userspace -I/mnt/data/Builds/hiperiso/src/gui/Lib/exfat/src/libexfat -I/mnt/data/Builds/hiperiso/src/gui/Lib/fat_io_lib -I/usr/include/qt -I/usr/include/qt/QtWidgets -I/usr/include/qt/QtGui -I/usr/include/qt/QtCore -I/usr/include/c++/16.1.1 -I/usr/include/c++/16.1.1/x86_64-pc-linux-gnu -I/usr/include/c++/16.1.1/backward -I/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include -I/usr/local/include -I/usr/include hiperiso2diskwindow.h -o moc_hiperiso2diskwindow.cpp + +compiler_moc_objc_header_make_all: +compiler_moc_objc_header_clean: +compiler_moc_source_make_all: +compiler_moc_source_clean: +compiler_uic_make_all: ui_partcfgdialog.h ui_hiperiso2diskwindow.h +compiler_uic_clean: + -$(DEL_FILE) ui_partcfgdialog.h ui_hiperiso2diskwindow.h +ui_partcfgdialog.h: partcfgdialog.ui \ + /usr/bin/uic + /usr/bin/uic partcfgdialog.ui -o ui_partcfgdialog.h + +ui_hiperiso2diskwindow.h: hiperiso2diskwindow.ui \ + /usr/bin/uic + /usr/bin/uic hiperiso2diskwindow.ui -o ui_hiperiso2diskwindow.h + +compiler_yacc_decl_make_all: +compiler_yacc_decl_clean: +compiler_yacc_impl_make_all: +compiler_yacc_impl_clean: +compiler_lex_make_all: +compiler_lex_clean: +compiler_clean: compiler_moc_predefs_clean compiler_moc_header_clean compiler_uic_clean + +####### Compile + +hiperiso_crc32.o: ../Core/hiperiso_crc32.c + $(CC) -c $(CFLAGS) $(INCPATH) -o hiperiso_crc32.o ../Core/hiperiso_crc32.c + +hiperiso_disk.o: ../Core/hiperiso_disk.c ../Core/hiperiso_define.h \ + ../Core/hiperiso_disk.h \ + ../Core/hiperiso_util.h \ + ../Lib/fat_io_lib/fat_filelib.h \ + ../Lib/fat_io_lib/fat_opts.h \ + ../Lib/fat_io_lib/fat_access.h \ + ../Lib/fat_io_lib/fat_defs.h \ + ../Lib/fat_io_lib/fat_types.h \ + ../Lib/fat_io_lib/fat_list.h + $(CC) -c $(CFLAGS) $(INCPATH) -o hiperiso_disk.o ../Core/hiperiso_disk.c + +hiperiso_json.o: ../Core/hiperiso_json.c ../Core/hiperiso_define.h \ + ../Core/hiperiso_util.h \ + ../Core/hiperiso_json.h + $(CC) -c $(CFLAGS) $(INCPATH) -o hiperiso_json.o ../Core/hiperiso_json.c + +hiperiso_log.o: ../Core/hiperiso_log.c ../Core/hiperiso_define.h + $(CC) -c $(CFLAGS) $(INCPATH) -o hiperiso_log.o ../Core/hiperiso_log.c + +hiperiso_md5.o: ../Core/hiperiso_md5.c + $(CC) -c $(CFLAGS) $(INCPATH) -o hiperiso_md5.o ../Core/hiperiso_md5.c + +hiperiso_util.o: ../Core/hiperiso_util.c ../Core/hiperiso_define.h \ + ../Core/hiperiso_util.h + $(CC) -c $(CFLAGS) $(INCPATH) -o hiperiso_util.o ../Core/hiperiso_util.c + +cluster.o: ../Lib/exfat/src/libexfat/cluster.c ../Lib/exfat/src/libexfat/exfat.h \ + ../Lib/exfat/src/libexfat/config.h \ + ../Lib/exfat/src/libexfat/compiler.h \ + ../Lib/exfat/src/libexfat/exfatfs.h \ + ../Lib/exfat/src/libexfat/byteorder.h \ + ../Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o cluster.o ../Lib/exfat/src/libexfat/cluster.c + +io.o: ../Lib/exfat/src/libexfat/io.c ../Lib/exfat/src/libexfat/exfat.h \ + ../Lib/exfat/src/libexfat/config.h \ + ../Lib/exfat/src/libexfat/compiler.h \ + ../Lib/exfat/src/libexfat/exfatfs.h \ + ../Lib/exfat/src/libexfat/byteorder.h \ + ../Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o io.o ../Lib/exfat/src/libexfat/io.c + +lookup.o: ../Lib/exfat/src/libexfat/lookup.c ../Lib/exfat/src/libexfat/exfat.h \ + ../Lib/exfat/src/libexfat/config.h \ + ../Lib/exfat/src/libexfat/compiler.h \ + ../Lib/exfat/src/libexfat/exfatfs.h \ + ../Lib/exfat/src/libexfat/byteorder.h \ + ../Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o lookup.o ../Lib/exfat/src/libexfat/lookup.c + +mount.o: ../Lib/exfat/src/libexfat/mount.c ../Lib/exfat/src/libexfat/exfat.h \ + ../Lib/exfat/src/libexfat/config.h \ + ../Lib/exfat/src/libexfat/compiler.h \ + ../Lib/exfat/src/libexfat/exfatfs.h \ + ../Lib/exfat/src/libexfat/byteorder.h \ + ../Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o mount.o ../Lib/exfat/src/libexfat/mount.c + +node.o: ../Lib/exfat/src/libexfat/node.c ../Lib/exfat/src/libexfat/exfat.h \ + ../Lib/exfat/src/libexfat/config.h \ + ../Lib/exfat/src/libexfat/compiler.h \ + ../Lib/exfat/src/libexfat/exfatfs.h \ + ../Lib/exfat/src/libexfat/byteorder.h \ + ../Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o node.o ../Lib/exfat/src/libexfat/node.c + +repair.o: ../Lib/exfat/src/libexfat/repair.c ../Lib/exfat/src/libexfat/exfat.h \ + ../Lib/exfat/src/libexfat/config.h \ + ../Lib/exfat/src/libexfat/compiler.h \ + ../Lib/exfat/src/libexfat/exfatfs.h \ + ../Lib/exfat/src/libexfat/byteorder.h \ + ../Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o repair.o ../Lib/exfat/src/libexfat/repair.c + +time.o: ../Lib/exfat/src/libexfat/time.c ../Lib/exfat/src/libexfat/exfat.h \ + ../Lib/exfat/src/libexfat/config.h \ + ../Lib/exfat/src/libexfat/compiler.h \ + ../Lib/exfat/src/libexfat/exfatfs.h \ + ../Lib/exfat/src/libexfat/byteorder.h \ + ../Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o time.o ../Lib/exfat/src/libexfat/time.c + +utf.o: ../Lib/exfat/src/libexfat/utf.c ../Lib/exfat/src/libexfat/exfat.h \ + ../Lib/exfat/src/libexfat/config.h \ + ../Lib/exfat/src/libexfat/compiler.h \ + ../Lib/exfat/src/libexfat/exfatfs.h \ + ../Lib/exfat/src/libexfat/byteorder.h \ + ../Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o utf.o ../Lib/exfat/src/libexfat/utf.c + +utils.o: ../Lib/exfat/src/libexfat/utils.c ../Lib/exfat/src/libexfat/exfat.h \ + ../Lib/exfat/src/libexfat/config.h \ + ../Lib/exfat/src/libexfat/compiler.h \ + ../Lib/exfat/src/libexfat/exfatfs.h \ + ../Lib/exfat/src/libexfat/byteorder.h \ + ../Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o utils.o ../Lib/exfat/src/libexfat/utils.c + +cbm.o: ../Lib/exfat/src/mkfs/cbm.c ../Lib/exfat/src/mkfs/cbm.h \ + ../Lib/exfat/src/mkfs/mkexfat.h \ + ../Lib/exfat/src/libexfat/exfat.h \ + ../Lib/exfat/src/libexfat/config.h \ + ../Lib/exfat/src/libexfat/compiler.h \ + ../Lib/exfat/src/libexfat/exfatfs.h \ + ../Lib/exfat/src/libexfat/byteorder.h \ + ../Lib/exfat/src/libexfat/platform.h \ + ../Lib/exfat/src/mkfs/fat.h \ + ../Lib/exfat/src/mkfs/uct.h \ + ../Lib/exfat/src/mkfs/rootdir.h + $(CC) -c $(CFLAGS) $(INCPATH) -o cbm.o ../Lib/exfat/src/mkfs/cbm.c + +fat.o: ../Lib/exfat/src/mkfs/fat.c ../Lib/exfat/src/mkfs/fat.h \ + ../Lib/exfat/src/mkfs/mkexfat.h \ + ../Lib/exfat/src/libexfat/exfat.h \ + ../Lib/exfat/src/libexfat/config.h \ + ../Lib/exfat/src/libexfat/compiler.h \ + ../Lib/exfat/src/libexfat/exfatfs.h \ + ../Lib/exfat/src/libexfat/byteorder.h \ + ../Lib/exfat/src/libexfat/platform.h \ + ../Lib/exfat/src/mkfs/cbm.h \ + ../Lib/exfat/src/mkfs/uct.h \ + ../Lib/exfat/src/mkfs/rootdir.h + $(CC) -c $(CFLAGS) $(INCPATH) -o fat.o ../Lib/exfat/src/mkfs/fat.c + +mkexfat.o: ../Lib/exfat/src/mkfs/mkexfat.c ../Lib/exfat/src/mkfs/mkexfat.h \ + ../Lib/exfat/src/libexfat/exfat.h \ + ../Lib/exfat/src/libexfat/config.h \ + ../Lib/exfat/src/libexfat/compiler.h \ + ../Lib/exfat/src/libexfat/exfatfs.h \ + ../Lib/exfat/src/libexfat/byteorder.h \ + ../Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o mkexfat.o ../Lib/exfat/src/mkfs/mkexfat.c + +mkexfat_main.o: ../Lib/exfat/src/mkfs/mkexfat_main.c ../Lib/exfat/src/mkfs/mkexfat.h \ + ../Lib/exfat/src/libexfat/exfat.h \ + ../Lib/exfat/src/libexfat/config.h \ + ../Lib/exfat/src/libexfat/compiler.h \ + ../Lib/exfat/src/libexfat/exfatfs.h \ + ../Lib/exfat/src/libexfat/byteorder.h \ + ../Lib/exfat/src/libexfat/platform.h \ + ../Lib/exfat/src/mkfs/vbr.h \ + ../Lib/exfat/src/mkfs/fat.h \ + ../Lib/exfat/src/mkfs/cbm.h \ + ../Lib/exfat/src/mkfs/uct.h \ + ../Lib/exfat/src/mkfs/rootdir.h + $(CC) -c $(CFLAGS) $(INCPATH) -o mkexfat_main.o ../Lib/exfat/src/mkfs/mkexfat_main.c + +rootdir.o: ../Lib/exfat/src/mkfs/rootdir.c ../Lib/exfat/src/mkfs/rootdir.h \ + ../Lib/exfat/src/mkfs/mkexfat.h \ + ../Lib/exfat/src/libexfat/exfat.h \ + ../Lib/exfat/src/libexfat/config.h \ + ../Lib/exfat/src/libexfat/compiler.h \ + ../Lib/exfat/src/libexfat/exfatfs.h \ + ../Lib/exfat/src/libexfat/byteorder.h \ + ../Lib/exfat/src/libexfat/platform.h \ + ../Lib/exfat/src/mkfs/uct.h \ + ../Lib/exfat/src/mkfs/cbm.h \ + ../Lib/exfat/src/mkfs/uctc.h + $(CC) -c $(CFLAGS) $(INCPATH) -o rootdir.o ../Lib/exfat/src/mkfs/rootdir.c + +uct.o: ../Lib/exfat/src/mkfs/uct.c ../Lib/exfat/src/mkfs/uct.h \ + ../Lib/exfat/src/mkfs/mkexfat.h \ + ../Lib/exfat/src/libexfat/exfat.h \ + ../Lib/exfat/src/libexfat/config.h \ + ../Lib/exfat/src/libexfat/compiler.h \ + ../Lib/exfat/src/libexfat/exfatfs.h \ + ../Lib/exfat/src/libexfat/byteorder.h \ + ../Lib/exfat/src/libexfat/platform.h \ + ../Lib/exfat/src/mkfs/uctc.h + $(CC) -c $(CFLAGS) $(INCPATH) -o uct.o ../Lib/exfat/src/mkfs/uct.c + +uctc.o: ../Lib/exfat/src/mkfs/uctc.c ../Lib/exfat/src/mkfs/uctc.h + $(CC) -c $(CFLAGS) $(INCPATH) -o uctc.o ../Lib/exfat/src/mkfs/uctc.c + +vbr.o: ../Lib/exfat/src/mkfs/vbr.c ../Lib/exfat/src/mkfs/vbr.h \ + ../Lib/exfat/src/mkfs/mkexfat.h \ + ../Lib/exfat/src/libexfat/exfat.h \ + ../Lib/exfat/src/libexfat/config.h \ + ../Lib/exfat/src/libexfat/compiler.h \ + ../Lib/exfat/src/libexfat/exfatfs.h \ + ../Lib/exfat/src/libexfat/byteorder.h \ + ../Lib/exfat/src/libexfat/platform.h \ + ../Lib/exfat/src/mkfs/fat.h \ + ../Lib/exfat/src/mkfs/cbm.h \ + ../Lib/exfat/src/mkfs/uct.h \ + ../Lib/exfat/src/mkfs/rootdir.h + $(CC) -c $(CFLAGS) $(INCPATH) -o vbr.o ../Lib/exfat/src/mkfs/vbr.c + +fat_access.o: ../Lib/fat_io_lib/fat_access.c ../Lib/fat_io_lib/fat_defs.h \ + ../Lib/fat_io_lib/fat_opts.h \ + ../Lib/fat_io_lib/fat_types.h \ + ../Lib/fat_io_lib/fat_access.h \ + ../Lib/fat_io_lib/fat_table.h \ + ../Lib/fat_io_lib/fat_misc.h \ + ../Lib/fat_io_lib/fat_write.h \ + ../Lib/fat_io_lib/fat_string.h + $(CC) -c $(CFLAGS) $(INCPATH) -o fat_access.o ../Lib/fat_io_lib/fat_access.c + +fat_cache.o: ../Lib/fat_io_lib/fat_cache.c ../Lib/fat_io_lib/fat_cache.h \ + ../Lib/fat_io_lib/fat_filelib.h \ + ../Lib/fat_io_lib/fat_opts.h \ + ../Lib/fat_io_lib/fat_access.h \ + ../Lib/fat_io_lib/fat_defs.h \ + ../Lib/fat_io_lib/fat_types.h \ + ../Lib/fat_io_lib/fat_list.h + $(CC) -c $(CFLAGS) $(INCPATH) -o fat_cache.o ../Lib/fat_io_lib/fat_cache.c + +fat_filelib.o: ../Lib/fat_io_lib/fat_filelib.c ../Lib/fat_io_lib/fat_defs.h \ + ../Lib/fat_io_lib/fat_opts.h \ + ../Lib/fat_io_lib/fat_types.h \ + ../Lib/fat_io_lib/fat_access.h \ + ../Lib/fat_io_lib/fat_table.h \ + ../Lib/fat_io_lib/fat_misc.h \ + ../Lib/fat_io_lib/fat_write.h \ + ../Lib/fat_io_lib/fat_string.h \ + ../Lib/fat_io_lib/fat_filelib.h \ + ../Lib/fat_io_lib/fat_list.h \ + ../Lib/fat_io_lib/fat_cache.h + $(CC) -c $(CFLAGS) $(INCPATH) -o fat_filelib.o ../Lib/fat_io_lib/fat_filelib.c + +fat_format.o: ../Lib/fat_io_lib/fat_format.c ../Lib/fat_io_lib/fat_defs.h \ + ../Lib/fat_io_lib/fat_opts.h \ + ../Lib/fat_io_lib/fat_types.h \ + ../Lib/fat_io_lib/fat_access.h \ + ../Lib/fat_io_lib/fat_table.h \ + ../Lib/fat_io_lib/fat_misc.h \ + ../Lib/fat_io_lib/fat_write.h \ + ../Lib/fat_io_lib/fat_string.h \ + ../Lib/fat_io_lib/fat_format.h + $(CC) -c $(CFLAGS) $(INCPATH) -o fat_format.o ../Lib/fat_io_lib/fat_format.c + +fat_misc.o: ../Lib/fat_io_lib/fat_misc.c ../Lib/fat_io_lib/fat_misc.h \ + ../Lib/fat_io_lib/fat_defs.h \ + ../Lib/fat_io_lib/fat_opts.h \ + ../Lib/fat_io_lib/fat_types.h + $(CC) -c $(CFLAGS) $(INCPATH) -o fat_misc.o ../Lib/fat_io_lib/fat_misc.c + +fat_string.o: ../Lib/fat_io_lib/fat_string.c ../Lib/fat_io_lib/fat_string.h + $(CC) -c $(CFLAGS) $(INCPATH) -o fat_string.o ../Lib/fat_io_lib/fat_string.c + +fat_table.o: ../Lib/fat_io_lib/fat_table.c ../Lib/fat_io_lib/fat_defs.h \ + ../Lib/fat_io_lib/fat_opts.h \ + ../Lib/fat_io_lib/fat_types.h \ + ../Lib/fat_io_lib/fat_access.h \ + ../Lib/fat_io_lib/fat_table.h \ + ../Lib/fat_io_lib/fat_misc.h + $(CC) -c $(CFLAGS) $(INCPATH) -o fat_table.o ../Lib/fat_io_lib/fat_table.c + +fat_write.o: ../Lib/fat_io_lib/fat_write.c ../Lib/fat_io_lib/fat_defs.h \ + ../Lib/fat_io_lib/fat_opts.h \ + ../Lib/fat_io_lib/fat_types.h \ + ../Lib/fat_io_lib/fat_access.h \ + ../Lib/fat_io_lib/fat_table.h \ + ../Lib/fat_io_lib/fat_misc.h \ + ../Lib/fat_io_lib/fat_write.h \ + ../Lib/fat_io_lib/fat_string.h + $(CC) -c $(CFLAGS) $(INCPATH) -o fat_write.o ../Lib/fat_io_lib/fat_write.c + +decompress_unxz.o: ../Lib/xz-embedded/linux/lib/decompress_unxz.c ../Lib/xz-embedded/linux/include/linux/xz.h \ + ../Lib/xz-embedded/linux/lib/xz/xz_private.h \ + ../Lib/xz-embedded/userspace/xz_config.h \ + ../Lib/xz-embedded/linux/lib/xz/xz_crc32.c \ + ../Lib/xz-embedded/linux/lib/xz/xz_dec_stream.c \ + ../Lib/xz-embedded/linux/lib/xz/xz_stream.h \ + ../Lib/xz-embedded/linux/lib/xz/xz_dec_lzma2.c \ + ../Lib/xz-embedded/linux/lib/xz/xz_lzma2.h \ + ../Lib/xz-embedded/linux/lib/xz/xz_dec_bcj.c + $(CC) -c $(CFLAGS) $(INCPATH) -o decompress_unxz.o ../Lib/xz-embedded/linux/lib/decompress_unxz.c + +refresh_icon_data.o: refresh_icon_data.c + $(CC) -c $(CFLAGS) $(INCPATH) -o refresh_icon_data.o refresh_icon_data.c + +secure_icon_data.o: secure_icon_data.c + $(CC) -c $(CFLAGS) $(INCPATH) -o secure_icon_data.o secure_icon_data.c + +hiperiso_qt_stub.o: hiperiso_qt_stub.c ../Core/hiperiso_define.h \ + ../Core/hiperiso_json.h \ + ../Core/hiperiso_util.h \ + ../Core/hiperiso_disk.h \ + ../Web/hiperiso_http.h \ + ../Lib/libhttp/include/civetweb.h + $(CC) -c $(CFLAGS) $(INCPATH) -o hiperiso_qt_stub.o hiperiso_qt_stub.c + +hiperiso_http.o: ../Web/hiperiso_http.c ../Core/hiperiso_define.h \ + ../Core/hiperiso_json.h \ + ../Core/hiperiso_util.h \ + ../Core/hiperiso_disk.h \ + ../Web/hiperiso_http.h \ + ../Lib/libhttp/include/civetweb.h \ + ../Lib/fat_io_lib/fat_filelib.h \ + ../Lib/fat_io_lib/fat_opts.h \ + ../Lib/fat_io_lib/fat_access.h \ + ../Lib/fat_io_lib/fat_defs.h \ + ../Lib/fat_io_lib/fat_types.h \ + ../Lib/fat_io_lib/fat_list.h + $(CC) -c $(CFLAGS) $(INCPATH) -o hiperiso_http.o ../Web/hiperiso_http.c + +main.o: main.cpp hiperiso2diskwindow.h \ + partcfgdialog.h \ + ../Core/hiperiso_define.h \ + ../Core/hiperiso_util.h \ + hiperiso_qt.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o main.o main.cpp + +partcfgdialog.o: partcfgdialog.cpp partcfgdialog.h \ + ui_partcfgdialog.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o partcfgdialog.o partcfgdialog.cpp + +hiperiso2diskwindow.o: hiperiso2diskwindow.cpp hiperiso2diskwindow.h \ + partcfgdialog.h \ + ui_hiperiso2diskwindow.h \ + ../Core/hiperiso_define.h \ + ../Core/hiperiso_util.h \ + ../Core/hiperiso_disk.h \ + ../Core/hiperiso_json.h \ + ../Web/hiperiso_http.h \ + ../Lib/libhttp/include/civetweb.h \ + hiperiso_qt.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o hiperiso2diskwindow.o hiperiso2diskwindow.cpp + +moc_partcfgdialog.o: moc_partcfgdialog.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_partcfgdialog.o moc_partcfgdialog.cpp + +moc_hiperiso2diskwindow.o: moc_hiperiso2diskwindow.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_hiperiso2diskwindow.o moc_hiperiso2diskwindow.cpp + +####### Install + +install_target: first FORCE + @test -d $(INSTALL_ROOT)/opt/Hiperiso2Disk/bin || mkdir -p $(INSTALL_ROOT)/opt/Hiperiso2Disk/bin + $(QINSTALL_PROGRAM) $(QMAKE_TARGET) $(INSTALL_ROOT)/opt/Hiperiso2Disk/bin/$(QMAKE_TARGET) + +uninstall_target: FORCE + -$(DEL_FILE) $(INSTALL_ROOT)/opt/Hiperiso2Disk/bin/$(QMAKE_TARGET) + -$(DEL_DIR) $(INSTALL_ROOT)/opt/Hiperiso2Disk/bin/ + + +install: install_target FORCE + +uninstall: uninstall_target FORCE + +FORCE: + diff --git a/src/gui/QT/build_output/.qmake.stash b/src/gui/QT/build_output/.qmake.stash new file mode 100644 index 0000000..e4723e0 --- /dev/null +++ b/src/gui/QT/build_output/.qmake.stash @@ -0,0 +1,20 @@ +QMAKE_CXX.QT_COMPILER_STDCXX = 202002L +QMAKE_CXX.QMAKE_GCC_MAJOR_VERSION = 16 +QMAKE_CXX.QMAKE_GCC_MINOR_VERSION = 1 +QMAKE_CXX.QMAKE_GCC_PATCH_VERSION = 1 +QMAKE_CXX.COMPILER_MACROS = \ + QT_COMPILER_STDCXX \ + QMAKE_GCC_MAJOR_VERSION \ + QMAKE_GCC_MINOR_VERSION \ + QMAKE_GCC_PATCH_VERSION +QMAKE_CXX.INCDIRS = \ + /usr/include/c++/16.1.1 \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu \ + /usr/include/c++/16.1.1/backward \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include \ + /usr/local/include \ + /usr/include +QMAKE_CXX.LIBDIRS = \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1 \ + /usr/lib \ + /lib diff --git a/src/gui/QT/build_output/Hiperiso2Disk b/src/gui/QT/build_output/Hiperiso2Disk new file mode 100755 index 0000000..fecfb02 Binary files /dev/null and b/src/gui/QT/build_output/Hiperiso2Disk differ diff --git a/src/gui/QT/build_output/Makefile b/src/gui/QT/build_output/Makefile new file mode 100644 index 0000000..dd89fc6 --- /dev/null +++ b/src/gui/QT/build_output/Makefile @@ -0,0 +1,1081 @@ +############################################################################# +# Makefile for building: Hiperiso2Disk +# Generated by qmake (3.1) (Qt 5.15.19) +# Project: ../Hiperiso2Disk.pro +# Template: app +# Command: /usr/bin/qmake -o Makefile ../Hiperiso2Disk.pro +############################################################################# + +MAKEFILE = Makefile + +EQ = = + +####### Compiler, tools and options + +CC = gcc +CXX = g++ +DEFINES = -DQT_DEPRECATED_WARNINGS -DSTATIC=static -DINIT= -DQT_CHECK_EUID -D_FILE_OFFSET_BITS=64 -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB +CFLAGS = -pipe -O2 -flto -fno-fat-lto-objects -Wall -Wextra -D_REENTRANT -fPIC $(DEFINES) +CXXFLAGS = -pipe -O2 -std=gnu++11 -flto -fno-fat-lto-objects -Wall -Wextra -D_REENTRANT -fPIC $(DEFINES) +INCPATH = -I../../QT -I. -I../../Core -I../../Web -I../../QT -I../../Include -I../../Lib/libhttp/include -I/mnt/data/Builds/hiperiso/src/gui/QT/../Lib/fat_io_lib/include -I../../Lib/xz-embedded/linux/include -I../../Lib/xz-embedded/linux/include/linux -I../../Lib/xz-embedded/userspace -I../../Lib/exfat/src/libexfat -I../../Lib/fat_io_lib -I/usr/include/qt -I/usr/include/qt/QtWidgets -I/usr/include/qt/QtGui -I/usr/include/qt/QtCore -I. -I. -I/usr/lib/qt/mkspecs/linux-g++ +QMAKE = /usr/bin/qmake +DEL_FILE = rm -f +CHK_DIR_EXISTS= test -d +MKDIR = mkdir -p +COPY = cp -f +COPY_FILE = cp -f +COPY_DIR = cp -f -R +INSTALL_FILE = install -m 644 -p +INSTALL_PROGRAM = install -m 755 -p +INSTALL_DIR = cp -f -R +QINSTALL = /usr/bin/qmake -install qinstall +QINSTALL_PROGRAM = /usr/bin/qmake -install qinstall -exe +DEL_FILE = rm -f +SYMLINK = ln -f -s +DEL_DIR = rmdir +MOVE = mv -f +TAR = tar -cf +COMPRESS = gzip -9f +DISTNAME = Hiperiso2Disk1.0.0 +DISTDIR = /mnt/data/Builds/hiperiso/src/gui/QT/build_output/.tmp/Hiperiso2Disk1.0.0 +LINK = g++ +LFLAGS = -Wl,-O1 -pipe -O2 -std=gnu++11 -flto=16 -fno-fat-lto-objects -fuse-linker-plugin -fPIC +LIBS = $(SUBLIBS) /usr/lib/libQt5Widgets.so /usr/lib/libQt5Gui.so /usr/lib/libQt5Core.so -lGL -lpthread +AR = gcc-ar cqs +RANLIB = +SED = sed +STRIP = strip + +####### Output directory + +OBJECTS_DIR = ./ + +####### Files + +SOURCES = ../../Core/hiperiso_crc32.c \ + ../../Core/hiperiso_disk.c \ + ../../Core/hiperiso_json.c \ + ../../Core/hiperiso_log.c \ + ../../Core/hiperiso_md5.c \ + ../../Core/hiperiso_util.c \ + ../../Lib/exfat/src/libexfat/cluster.c \ + ../../Lib/exfat/src/libexfat/io.c \ + ../../Lib/exfat/src/libexfat/lookup.c \ + ../../Lib/exfat/src/libexfat/mount.c \ + ../../Lib/exfat/src/libexfat/node.c \ + ../../Lib/exfat/src/libexfat/repair.c \ + ../../Lib/exfat/src/libexfat/time.c \ + ../../Lib/exfat/src/libexfat/utf.c \ + ../../Lib/exfat/src/libexfat/utils.c \ + ../../Lib/exfat/src/mkfs/cbm.c \ + ../../Lib/exfat/src/mkfs/fat.c \ + ../../Lib/exfat/src/mkfs/mkexfat.c \ + ../../Lib/exfat/src/mkfs/mkexfat_main.c \ + ../../Lib/exfat/src/mkfs/rootdir.c \ + ../../Lib/exfat/src/mkfs/uct.c \ + ../../Lib/exfat/src/mkfs/uctc.c \ + ../../Lib/exfat/src/mkfs/vbr.c \ + ../../Lib/fat_io_lib/fat_access.c \ + ../../Lib/fat_io_lib/fat_cache.c \ + ../../Lib/fat_io_lib/fat_filelib.c \ + ../../Lib/fat_io_lib/fat_format.c \ + ../../Lib/fat_io_lib/fat_misc.c \ + ../../Lib/fat_io_lib/fat_string.c \ + ../../Lib/fat_io_lib/fat_table.c \ + ../../Lib/fat_io_lib/fat_write.c \ + ../../Lib/xz-embedded/linux/lib/decompress_unxz.c \ + ../refresh_icon_data.c \ + ../secure_icon_data.c \ + ../hiperiso_qt_stub.c \ + ../../Web/hiperiso_http.c \ + ../main.cpp \ + ../partcfgdialog.cpp \ + ../hiperiso2diskwindow.cpp moc_partcfgdialog.cpp \ + moc_hiperiso2diskwindow.cpp +OBJECTS = hiperiso_crc32.o \ + hiperiso_disk.o \ + hiperiso_json.o \ + hiperiso_log.o \ + hiperiso_md5.o \ + hiperiso_util.o \ + cluster.o \ + io.o \ + lookup.o \ + mount.o \ + node.o \ + repair.o \ + time.o \ + utf.o \ + utils.o \ + cbm.o \ + fat.o \ + mkexfat.o \ + mkexfat_main.o \ + rootdir.o \ + uct.o \ + uctc.o \ + vbr.o \ + fat_access.o \ + fat_cache.o \ + fat_filelib.o \ + fat_format.o \ + fat_misc.o \ + fat_string.o \ + fat_table.o \ + fat_write.o \ + decompress_unxz.o \ + refresh_icon_data.o \ + secure_icon_data.o \ + hiperiso_qt_stub.o \ + hiperiso_http.o \ + main.o \ + partcfgdialog.o \ + hiperiso2diskwindow.o \ + moc_partcfgdialog.o \ + moc_hiperiso2diskwindow.o +DIST = ../Lib/fat_io_lib/API.txt \ + ../Lib/fat_io_lib/COPYRIGHT.txt \ + ../Lib/fat_io_lib/Configuration.txt \ + ../Lib/fat_io_lib/History.txt \ + ../Lib/fat_io_lib/License.txt \ + ../Lib/fat_io_lib/Media \ + ../Access \ + ../API.txt \ + ../Lib/fat_io_lib/version.txt \ + /usr/lib/qt/mkspecs/features/spec_pre.prf \ + /usr/lib/qt/mkspecs/common/unix.conf \ + /usr/lib/qt/mkspecs/common/linux.conf \ + /usr/lib/qt/mkspecs/common/sanitize.conf \ + /usr/lib/qt/mkspecs/common/gcc-base.conf \ + /usr/lib/qt/mkspecs/common/gcc-base-unix.conf \ + /usr/lib/qt/mkspecs/common/g++-base.conf \ + /usr/lib/qt/mkspecs/common/g++-unix.conf \ + /usr/lib/qt/mkspecs/qconfig.pri \ + /usr/lib/qt/mkspecs/modules/qt_KArchive.pri \ + /usr/lib/qt/mkspecs/modules/qt_KAuth.pri \ + /usr/lib/qt/mkspecs/modules/qt_KAuthCore.pri \ + /usr/lib/qt/mkspecs/modules/qt_KCodecs.pri \ + /usr/lib/qt/mkspecs/modules/qt_KCompletion.pri \ + /usr/lib/qt/mkspecs/modules/qt_KConfigCore.pri \ + /usr/lib/qt/mkspecs/modules/qt_KConfigGui.pri \ + /usr/lib/qt/mkspecs/modules/qt_KConfigWidgets.pri \ + /usr/lib/qt/mkspecs/modules/qt_KCoreAddons.pri \ + /usr/lib/qt/mkspecs/modules/qt_KCrash.pri \ + /usr/lib/qt/mkspecs/modules/qt_KGuiAddons.pri \ + /usr/lib/qt/mkspecs/modules/qt_KI18n.pri \ + /usr/lib/qt/mkspecs/modules/qt_KIconThemes.pri \ + /usr/lib/qt/mkspecs/modules/qt_Kirigami2.pri \ + /usr/lib/qt/mkspecs/modules/qt_KItemModels.pri \ + /usr/lib/qt/mkspecs/modules/qt_KItemViews.pri \ + /usr/lib/qt/mkspecs/modules/qt_KNotifications.pri \ + /usr/lib/qt/mkspecs/modules/qt_KWaylandClient.pri \ + /usr/lib/qt/mkspecs/modules/qt_KWaylandServer.pri \ + /usr/lib/qt/mkspecs/modules/qt_KWidgetsAddons.pri \ + /usr/lib/qt/mkspecs/modules/qt_KWindowSystem.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_accessibility_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_bootstrap_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_concurrent.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_concurrent_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_core.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_core_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_dbus.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_dbus_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_devicediscovery_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_edid_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_egl_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_eglfs_kms_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_eventdispatcher_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_fb_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_fontdatabase_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_glx_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_gui.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_gui_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_input_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_kms_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_linuxaccessibility_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_multimedia.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_multimedia_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_multimediagsttools_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_multimediawidgets.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_multimediawidgets_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_network.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_network_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_opengl.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_opengl_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_openglextensions.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_openglextensions_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_packetprotocol_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_platformcompositor_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_printsupport.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_printsupport_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qml.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qml_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmldebug_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmldevtools_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmlmodels.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmlmodels_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmltest.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmltest_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmlworkerscript.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmlworkerscript_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quick.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quick_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quickcontrols2.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quickcontrols2_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quickparticles_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quickshapes_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quicktemplates2.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quicktemplates2_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quickwidgets.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quickwidgets_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_service_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_sql.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_sql_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_svg.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_svg_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_testlib.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_testlib_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_texttospeech.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_texttospeech_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_theme_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_vulkan_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_waylandclient.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_waylandclient_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_waylandcompositor.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_waylandcompositor_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_widgets.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_widgets_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_x11extras.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_x11extras_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_xkbcommon_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_xml.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_xml_private.pri \ + /usr/lib/qt/mkspecs/features/qt_functions.prf \ + /usr/lib/qt/mkspecs/features/qt_config.prf \ + /usr/lib/qt/mkspecs/linux-g++/qmake.conf \ + /usr/lib/qt/mkspecs/features/spec_post.prf \ + ../.qmake.stash \ + /usr/lib/qt/mkspecs/features/exclusive_builds.prf \ + /usr/lib/qt/mkspecs/features/toolchain.prf \ + /usr/lib/qt/mkspecs/features/default_pre.prf \ + /usr/lib/qt/mkspecs/features/resolve_config.prf \ + /usr/lib/qt/mkspecs/features/default_post.prf \ + /usr/lib/qt/mkspecs/features/link_ltcg.prf \ + /usr/lib/qt/mkspecs/features/ltcg.prf \ + /usr/lib/qt/mkspecs/features/warn_on.prf \ + /usr/lib/qt/mkspecs/features/qt.prf \ + /usr/lib/qt/mkspecs/features/resources_functions.prf \ + /usr/lib/qt/mkspecs/features/resources.prf \ + /usr/lib/qt/mkspecs/features/moc.prf \ + /usr/lib/qt/mkspecs/features/unix/opengl.prf \ + /usr/lib/qt/mkspecs/features/uic.prf \ + /usr/lib/qt/mkspecs/features/unix/thread.prf \ + /usr/lib/qt/mkspecs/features/qmake_use.prf \ + /usr/lib/qt/mkspecs/features/file_copies.prf \ + /usr/lib/qt/mkspecs/features/testcase_targets.prf \ + /usr/lib/qt/mkspecs/features/exceptions.prf \ + /usr/lib/qt/mkspecs/features/yacc.prf \ + /usr/lib/qt/mkspecs/features/lex.prf \ + ../../Hiperiso2Disk.pro ../../Core/hiperiso_define.h \ + ../../Core/hiperiso_disk.h \ + ../../Core/hiperiso_json.h \ + ../../Core/hiperiso_util.h \ + ../../Include/Hiperiso2Disk.h \ + ../../Lib/exfat/src/libexfat/byteorder.h \ + ../../Lib/exfat/src/libexfat/compiler.h \ + ../../Lib/exfat/src/libexfat/config.h \ + ../../Lib/exfat/src/libexfat/exfat.h \ + ../../Lib/exfat/src/libexfat/exfatfs.h \ + ../../Lib/exfat/src/libexfat/platform.h \ + ../../Lib/exfat/src/mkfs/cbm.h \ + ../../Lib/exfat/src/mkfs/fat.h \ + ../../Lib/exfat/src/mkfs/mkexfat.h \ + ../../Lib/exfat/src/mkfs/rootdir.h \ + ../../Lib/exfat/src/mkfs/uct.h \ + ../../Lib/exfat/src/mkfs/uctc.h \ + ../../Lib/exfat/src/mkfs/vbr.h \ + ../../Lib/fat_io_lib/fat_access.h \ + ../../Lib/fat_io_lib/fat_cache.h \ + ../../Lib/fat_io_lib/fat_defs.h \ + ../../Lib/fat_io_lib/fat_filelib.h \ + ../../Lib/fat_io_lib/fat_format.h \ + ../../Lib/fat_io_lib/fat_list.h \ + ../../Lib/fat_io_lib/fat_misc.h \ + ../../Lib/fat_io_lib/fat_opts.h \ + ../../Lib/fat_io_lib/fat_string.h \ + ../../Lib/fat_io_lib/fat_table.h \ + ../../Lib/fat_io_lib/fat_types.h \ + ../../Lib/fat_io_lib/fat_write.h \ + ../../Lib/libhttp/include/civetweb.h \ + ../../Lib/libhttp/include/handle_form.inl \ + ../../Lib/libhttp/include/md5.inl \ + ../../Lib/libhttp/include/mod_duktape.inl \ + ../../Lib/libhttp/include/mod_lua.inl \ + ../../Lib/libhttp/include/timer.inl \ + ../hiperiso_qt.h \ + ../../Web/hiperiso_http.h \ + ../partcfgdialog.h \ + ../hiperiso2diskwindow.h ../../Core/hiperiso_crc32.c \ + ../../Core/hiperiso_disk.c \ + ../../Core/hiperiso_json.c \ + ../../Core/hiperiso_log.c \ + ../../Core/hiperiso_md5.c \ + ../../Core/hiperiso_util.c \ + ../../Lib/exfat/src/libexfat/cluster.c \ + ../../Lib/exfat/src/libexfat/io.c \ + ../../Lib/exfat/src/libexfat/lookup.c \ + ../../Lib/exfat/src/libexfat/mount.c \ + ../../Lib/exfat/src/libexfat/node.c \ + ../../Lib/exfat/src/libexfat/repair.c \ + ../../Lib/exfat/src/libexfat/time.c \ + ../../Lib/exfat/src/libexfat/utf.c \ + ../../Lib/exfat/src/libexfat/utils.c \ + ../../Lib/exfat/src/mkfs/cbm.c \ + ../../Lib/exfat/src/mkfs/fat.c \ + ../../Lib/exfat/src/mkfs/mkexfat.c \ + ../../Lib/exfat/src/mkfs/mkexfat_main.c \ + ../../Lib/exfat/src/mkfs/rootdir.c \ + ../../Lib/exfat/src/mkfs/uct.c \ + ../../Lib/exfat/src/mkfs/uctc.c \ + ../../Lib/exfat/src/mkfs/vbr.c \ + ../../Lib/fat_io_lib/fat_access.c \ + ../../Lib/fat_io_lib/fat_cache.c \ + ../../Lib/fat_io_lib/fat_filelib.c \ + ../../Lib/fat_io_lib/fat_format.c \ + ../../Lib/fat_io_lib/fat_misc.c \ + ../../Lib/fat_io_lib/fat_string.c \ + ../../Lib/fat_io_lib/fat_table.c \ + ../../Lib/fat_io_lib/fat_write.c \ + ../../Lib/xz-embedded/linux/lib/decompress_unxz.c \ + ../refresh_icon_data.c \ + ../secure_icon_data.c \ + ../hiperiso_qt_stub.c \ + ../../Web/hiperiso_http.c \ + ../main.cpp \ + ../partcfgdialog.cpp \ + ../hiperiso2diskwindow.cpp +QMAKE_TARGET = Hiperiso2Disk +DESTDIR = +TARGET = Hiperiso2Disk + + +first: all +####### Build rules + +Hiperiso2Disk: ui_partcfgdialog.h ui_hiperiso2diskwindow.h $(OBJECTS) + $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS) + +Makefile: ../Hiperiso2Disk.pro /usr/lib/qt/mkspecs/linux-g++/qmake.conf /usr/lib/qt/mkspecs/features/spec_pre.prf \ + /usr/lib/qt/mkspecs/common/unix.conf \ + /usr/lib/qt/mkspecs/common/linux.conf \ + /usr/lib/qt/mkspecs/common/sanitize.conf \ + /usr/lib/qt/mkspecs/common/gcc-base.conf \ + /usr/lib/qt/mkspecs/common/gcc-base-unix.conf \ + /usr/lib/qt/mkspecs/common/g++-base.conf \ + /usr/lib/qt/mkspecs/common/g++-unix.conf \ + /usr/lib/qt/mkspecs/qconfig.pri \ + /usr/lib/qt/mkspecs/modules/qt_KArchive.pri \ + /usr/lib/qt/mkspecs/modules/qt_KAuth.pri \ + /usr/lib/qt/mkspecs/modules/qt_KAuthCore.pri \ + /usr/lib/qt/mkspecs/modules/qt_KCodecs.pri \ + /usr/lib/qt/mkspecs/modules/qt_KCompletion.pri \ + /usr/lib/qt/mkspecs/modules/qt_KConfigCore.pri \ + /usr/lib/qt/mkspecs/modules/qt_KConfigGui.pri \ + /usr/lib/qt/mkspecs/modules/qt_KConfigWidgets.pri \ + /usr/lib/qt/mkspecs/modules/qt_KCoreAddons.pri \ + /usr/lib/qt/mkspecs/modules/qt_KCrash.pri \ + /usr/lib/qt/mkspecs/modules/qt_KGuiAddons.pri \ + /usr/lib/qt/mkspecs/modules/qt_KI18n.pri \ + /usr/lib/qt/mkspecs/modules/qt_KIconThemes.pri \ + /usr/lib/qt/mkspecs/modules/qt_Kirigami2.pri \ + /usr/lib/qt/mkspecs/modules/qt_KItemModels.pri \ + /usr/lib/qt/mkspecs/modules/qt_KItemViews.pri \ + /usr/lib/qt/mkspecs/modules/qt_KNotifications.pri \ + /usr/lib/qt/mkspecs/modules/qt_KWaylandClient.pri \ + /usr/lib/qt/mkspecs/modules/qt_KWaylandServer.pri \ + /usr/lib/qt/mkspecs/modules/qt_KWidgetsAddons.pri \ + /usr/lib/qt/mkspecs/modules/qt_KWindowSystem.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_accessibility_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_bootstrap_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_concurrent.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_concurrent_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_core.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_core_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_dbus.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_dbus_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_devicediscovery_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_edid_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_egl_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_eglfs_kms_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_eventdispatcher_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_fb_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_fontdatabase_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_glx_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_gui.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_gui_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_input_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_kms_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_linuxaccessibility_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_multimedia.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_multimedia_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_multimediagsttools_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_multimediawidgets.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_multimediawidgets_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_network.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_network_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_opengl.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_opengl_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_openglextensions.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_openglextensions_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_packetprotocol_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_platformcompositor_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_printsupport.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_printsupport_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qml.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qml_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmldebug_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmldevtools_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmlmodels.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmlmodels_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmltest.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmltest_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmlworkerscript.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmlworkerscript_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quick.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quick_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quickcontrols2.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quickcontrols2_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quickparticles_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quickshapes_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quicktemplates2.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quicktemplates2_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quickwidgets.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quickwidgets_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_service_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_sql.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_sql_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_svg.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_svg_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_testlib.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_testlib_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_texttospeech.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_texttospeech_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_theme_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_vulkan_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_waylandclient.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_waylandclient_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_waylandcompositor.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_waylandcompositor_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_widgets.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_widgets_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_x11extras.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_x11extras_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_xkbcommon_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_xml.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_xml_private.pri \ + /usr/lib/qt/mkspecs/features/qt_functions.prf \ + /usr/lib/qt/mkspecs/features/qt_config.prf \ + /usr/lib/qt/mkspecs/linux-g++/qmake.conf \ + /usr/lib/qt/mkspecs/features/spec_post.prf \ + .qmake.stash \ + /usr/lib/qt/mkspecs/features/exclusive_builds.prf \ + /usr/lib/qt/mkspecs/features/toolchain.prf \ + /usr/lib/qt/mkspecs/features/default_pre.prf \ + /usr/lib/qt/mkspecs/features/resolve_config.prf \ + /usr/lib/qt/mkspecs/features/default_post.prf \ + /usr/lib/qt/mkspecs/features/link_ltcg.prf \ + /usr/lib/qt/mkspecs/features/ltcg.prf \ + /usr/lib/qt/mkspecs/features/warn_on.prf \ + /usr/lib/qt/mkspecs/features/qt.prf \ + /usr/lib/qt/mkspecs/features/resources_functions.prf \ + /usr/lib/qt/mkspecs/features/resources.prf \ + /usr/lib/qt/mkspecs/features/moc.prf \ + /usr/lib/qt/mkspecs/features/unix/opengl.prf \ + /usr/lib/qt/mkspecs/features/uic.prf \ + /usr/lib/qt/mkspecs/features/unix/thread.prf \ + /usr/lib/qt/mkspecs/features/qmake_use.prf \ + /usr/lib/qt/mkspecs/features/file_copies.prf \ + /usr/lib/qt/mkspecs/features/testcase_targets.prf \ + /usr/lib/qt/mkspecs/features/exceptions.prf \ + /usr/lib/qt/mkspecs/features/yacc.prf \ + /usr/lib/qt/mkspecs/features/lex.prf \ + ../Hiperiso2Disk.pro + $(QMAKE) -o Makefile ../Hiperiso2Disk.pro +/usr/lib/qt/mkspecs/features/spec_pre.prf: +/usr/lib/qt/mkspecs/common/unix.conf: +/usr/lib/qt/mkspecs/common/linux.conf: +/usr/lib/qt/mkspecs/common/sanitize.conf: +/usr/lib/qt/mkspecs/common/gcc-base.conf: +/usr/lib/qt/mkspecs/common/gcc-base-unix.conf: +/usr/lib/qt/mkspecs/common/g++-base.conf: +/usr/lib/qt/mkspecs/common/g++-unix.conf: +/usr/lib/qt/mkspecs/qconfig.pri: +/usr/lib/qt/mkspecs/modules/qt_KArchive.pri: +/usr/lib/qt/mkspecs/modules/qt_KAuth.pri: +/usr/lib/qt/mkspecs/modules/qt_KAuthCore.pri: +/usr/lib/qt/mkspecs/modules/qt_KCodecs.pri: +/usr/lib/qt/mkspecs/modules/qt_KCompletion.pri: +/usr/lib/qt/mkspecs/modules/qt_KConfigCore.pri: +/usr/lib/qt/mkspecs/modules/qt_KConfigGui.pri: +/usr/lib/qt/mkspecs/modules/qt_KConfigWidgets.pri: +/usr/lib/qt/mkspecs/modules/qt_KCoreAddons.pri: +/usr/lib/qt/mkspecs/modules/qt_KCrash.pri: +/usr/lib/qt/mkspecs/modules/qt_KGuiAddons.pri: +/usr/lib/qt/mkspecs/modules/qt_KI18n.pri: +/usr/lib/qt/mkspecs/modules/qt_KIconThemes.pri: +/usr/lib/qt/mkspecs/modules/qt_Kirigami2.pri: +/usr/lib/qt/mkspecs/modules/qt_KItemModels.pri: +/usr/lib/qt/mkspecs/modules/qt_KItemViews.pri: +/usr/lib/qt/mkspecs/modules/qt_KNotifications.pri: +/usr/lib/qt/mkspecs/modules/qt_KWaylandClient.pri: +/usr/lib/qt/mkspecs/modules/qt_KWaylandServer.pri: +/usr/lib/qt/mkspecs/modules/qt_KWidgetsAddons.pri: +/usr/lib/qt/mkspecs/modules/qt_KWindowSystem.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_accessibility_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_bootstrap_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_concurrent.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_concurrent_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_core.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_core_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_dbus.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_dbus_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_devicediscovery_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_edid_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_egl_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_eglfs_kms_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_eventdispatcher_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_fb_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_fontdatabase_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_glx_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_gui.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_gui_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_input_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_kms_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_linuxaccessibility_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_multimedia.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_multimedia_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_multimediagsttools_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_multimediawidgets.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_multimediawidgets_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_network.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_network_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_opengl.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_opengl_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_openglextensions.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_openglextensions_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_packetprotocol_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_platformcompositor_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_printsupport.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_printsupport_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_qml.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_qml_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_qmldebug_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_qmldevtools_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_qmlmodels.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_qmlmodels_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_qmltest.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_qmltest_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_qmlworkerscript.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_qmlworkerscript_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_quick.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_quick_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_quickcontrols2.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_quickcontrols2_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_quickparticles_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_quickshapes_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_quicktemplates2.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_quicktemplates2_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_quickwidgets.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_quickwidgets_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_service_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_sql.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_sql_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_svg.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_svg_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_testlib.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_testlib_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_texttospeech.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_texttospeech_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_theme_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_vulkan_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_waylandclient.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_waylandclient_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_waylandcompositor.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_waylandcompositor_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_widgets.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_widgets_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_x11extras.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_x11extras_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_xkbcommon_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_xml.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_xml_private.pri: +/usr/lib/qt/mkspecs/features/qt_functions.prf: +/usr/lib/qt/mkspecs/features/qt_config.prf: +/usr/lib/qt/mkspecs/linux-g++/qmake.conf: +/usr/lib/qt/mkspecs/features/spec_post.prf: +.qmake.stash: +/usr/lib/qt/mkspecs/features/exclusive_builds.prf: +/usr/lib/qt/mkspecs/features/toolchain.prf: +/usr/lib/qt/mkspecs/features/default_pre.prf: +/usr/lib/qt/mkspecs/features/resolve_config.prf: +/usr/lib/qt/mkspecs/features/default_post.prf: +/usr/lib/qt/mkspecs/features/link_ltcg.prf: +/usr/lib/qt/mkspecs/features/ltcg.prf: +/usr/lib/qt/mkspecs/features/warn_on.prf: +/usr/lib/qt/mkspecs/features/qt.prf: +/usr/lib/qt/mkspecs/features/resources_functions.prf: +/usr/lib/qt/mkspecs/features/resources.prf: +/usr/lib/qt/mkspecs/features/moc.prf: +/usr/lib/qt/mkspecs/features/unix/opengl.prf: +/usr/lib/qt/mkspecs/features/uic.prf: +/usr/lib/qt/mkspecs/features/unix/thread.prf: +/usr/lib/qt/mkspecs/features/qmake_use.prf: +/usr/lib/qt/mkspecs/features/file_copies.prf: +/usr/lib/qt/mkspecs/features/testcase_targets.prf: +/usr/lib/qt/mkspecs/features/exceptions.prf: +/usr/lib/qt/mkspecs/features/yacc.prf: +/usr/lib/qt/mkspecs/features/lex.prf: +../Hiperiso2Disk.pro: +qmake: FORCE + @$(QMAKE) -o Makefile ../Hiperiso2Disk.pro + +qmake_all: FORCE + + +all: Makefile Hiperiso2Disk + +dist: distdir FORCE + (cd `dirname $(DISTDIR)` && $(TAR) $(DISTNAME).tar $(DISTNAME) && $(COMPRESS) $(DISTNAME).tar) && $(MOVE) `dirname $(DISTDIR)`/$(DISTNAME).tar.gz . && $(DEL_FILE) -r $(DISTDIR) + +distdir: FORCE + @test -d $(DISTDIR) || mkdir -p $(DISTDIR) + $(COPY_FILE) --parents $(DIST) $(DISTDIR)/ + $(COPY_FILE) --parents /usr/lib/qt/mkspecs/features/data/dummy.cpp $(DISTDIR)/ + $(COPY_FILE) --parents ../../Core/hiperiso_define.h ../../Core/hiperiso_disk.h ../../Core/hiperiso_json.h ../../Core/hiperiso_util.h ../../Include/Hiperiso2Disk.h ../../Lib/exfat/src/libexfat/byteorder.h ../../Lib/exfat/src/libexfat/compiler.h ../../Lib/exfat/src/libexfat/config.h ../../Lib/exfat/src/libexfat/exfat.h ../../Lib/exfat/src/libexfat/exfatfs.h ../../Lib/exfat/src/libexfat/platform.h ../../Lib/exfat/src/mkfs/cbm.h ../../Lib/exfat/src/mkfs/fat.h ../../Lib/exfat/src/mkfs/mkexfat.h ../../Lib/exfat/src/mkfs/rootdir.h ../../Lib/exfat/src/mkfs/uct.h ../../Lib/exfat/src/mkfs/uctc.h ../../Lib/exfat/src/mkfs/vbr.h ../../Lib/fat_io_lib/fat_access.h ../../Lib/fat_io_lib/fat_cache.h ../../Lib/fat_io_lib/fat_defs.h ../../Lib/fat_io_lib/fat_filelib.h ../../Lib/fat_io_lib/fat_format.h ../../Lib/fat_io_lib/fat_list.h ../../Lib/fat_io_lib/fat_misc.h ../../Lib/fat_io_lib/fat_opts.h ../../Lib/fat_io_lib/fat_string.h ../../Lib/fat_io_lib/fat_table.h ../../Lib/fat_io_lib/fat_types.h ../../Lib/fat_io_lib/fat_write.h ../../Lib/libhttp/include/civetweb.h ../../Lib/libhttp/include/handle_form.inl ../../Lib/libhttp/include/md5.inl ../../Lib/libhttp/include/mod_duktape.inl ../../Lib/libhttp/include/mod_lua.inl ../../Lib/libhttp/include/timer.inl ../hiperiso_qt.h ../../Web/hiperiso_http.h ../partcfgdialog.h ../hiperiso2diskwindow.h $(DISTDIR)/ + $(COPY_FILE) --parents ../../Core/hiperiso_crc32.c ../../Core/hiperiso_disk.c ../../Core/hiperiso_json.c ../../Core/hiperiso_log.c ../../Core/hiperiso_md5.c ../../Core/hiperiso_util.c ../../Lib/exfat/src/libexfat/cluster.c ../../Lib/exfat/src/libexfat/io.c ../../Lib/exfat/src/libexfat/lookup.c ../../Lib/exfat/src/libexfat/mount.c ../../Lib/exfat/src/libexfat/node.c ../../Lib/exfat/src/libexfat/repair.c ../../Lib/exfat/src/libexfat/time.c ../../Lib/exfat/src/libexfat/utf.c ../../Lib/exfat/src/libexfat/utils.c ../../Lib/exfat/src/mkfs/cbm.c ../../Lib/exfat/src/mkfs/fat.c ../../Lib/exfat/src/mkfs/mkexfat.c ../../Lib/exfat/src/mkfs/mkexfat_main.c ../../Lib/exfat/src/mkfs/rootdir.c ../../Lib/exfat/src/mkfs/uct.c ../../Lib/exfat/src/mkfs/uctc.c ../../Lib/exfat/src/mkfs/vbr.c ../../Lib/fat_io_lib/fat_access.c ../../Lib/fat_io_lib/fat_cache.c ../../Lib/fat_io_lib/fat_filelib.c ../../Lib/fat_io_lib/fat_format.c ../../Lib/fat_io_lib/fat_misc.c ../../Lib/fat_io_lib/fat_string.c ../../Lib/fat_io_lib/fat_table.c ../../Lib/fat_io_lib/fat_write.c ../../Lib/xz-embedded/linux/lib/decompress_unxz.c ../refresh_icon_data.c ../secure_icon_data.c ../hiperiso_qt_stub.c ../../Web/hiperiso_http.c ../main.cpp ../partcfgdialog.cpp ../hiperiso2diskwindow.cpp $(DISTDIR)/ + $(COPY_FILE) --parents ../partcfgdialog.ui ../hiperiso2diskwindow.ui $(DISTDIR)/ + + +clean: compiler_clean + -$(DEL_FILE) $(OBJECTS) + -$(DEL_FILE) *~ core *.core + + +distclean: clean + -$(DEL_FILE) $(TARGET) + -$(DEL_FILE) .qmake.stash + -$(DEL_FILE) Makefile + + +####### Sub-libraries + +mocclean: compiler_moc_header_clean compiler_moc_objc_header_clean compiler_moc_source_clean + +mocables: compiler_moc_header_make_all compiler_moc_objc_header_make_all compiler_moc_source_make_all + +check: first + +benchmark: first + +compiler_rcc_make_all: +compiler_rcc_clean: +compiler_moc_predefs_make_all: moc_predefs.h +compiler_moc_predefs_clean: + -$(DEL_FILE) moc_predefs.h +moc_predefs.h: /usr/lib/qt/mkspecs/features/data/dummy.cpp + g++ -pipe -O2 -std=gnu++11 -flto -fno-fat-lto-objects -Wall -Wextra -dM -E -o moc_predefs.h /usr/lib/qt/mkspecs/features/data/dummy.cpp + +compiler_moc_header_make_all: moc_partcfgdialog.cpp moc_hiperiso2diskwindow.cpp +compiler_moc_header_clean: + -$(DEL_FILE) moc_partcfgdialog.cpp moc_hiperiso2diskwindow.cpp +moc_partcfgdialog.cpp: ../partcfgdialog.h \ + moc_predefs.h \ + /usr/bin/moc + /usr/bin/moc $(DEFINES) --include /mnt/data/Builds/hiperiso/src/gui/QT/build_output/moc_predefs.h -I/usr/lib/qt/mkspecs/linux-g++ -I/mnt/data/Builds/hiperiso/src/gui/QT -I/mnt/data/Builds/hiperiso/src/gui/Core -I/mnt/data/Builds/hiperiso/src/gui/Web -I/mnt/data/Builds/hiperiso/src/gui/QT -I/mnt/data/Builds/hiperiso/src/gui/Include -I/mnt/data/Builds/hiperiso/src/gui/Lib/libhttp/include -I/mnt/data/Builds/hiperiso/src/gui/Lib/fat_io_lib/include -I/mnt/data/Builds/hiperiso/src/gui/Lib/xz-embedded/linux/include -I/mnt/data/Builds/hiperiso/src/gui/Lib/xz-embedded/linux/include/linux -I/mnt/data/Builds/hiperiso/src/gui/Lib/xz-embedded/userspace -I/mnt/data/Builds/hiperiso/src/gui/Lib/exfat/src/libexfat -I/mnt/data/Builds/hiperiso/src/gui/Lib/fat_io_lib -I/usr/include/qt -I/usr/include/qt/QtWidgets -I/usr/include/qt/QtGui -I/usr/include/qt/QtCore -I. -I/usr/include/c++/16.1.1 -I/usr/include/c++/16.1.1/x86_64-pc-linux-gnu -I/usr/include/c++/16.1.1/backward -I/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include -I/usr/local/include -I/usr/include ../partcfgdialog.h -o moc_partcfgdialog.cpp + +moc_hiperiso2diskwindow.cpp: ../hiperiso2diskwindow.h \ + ../partcfgdialog.h \ + moc_predefs.h \ + /usr/bin/moc + /usr/bin/moc $(DEFINES) --include /mnt/data/Builds/hiperiso/src/gui/QT/build_output/moc_predefs.h -I/usr/lib/qt/mkspecs/linux-g++ -I/mnt/data/Builds/hiperiso/src/gui/QT -I/mnt/data/Builds/hiperiso/src/gui/Core -I/mnt/data/Builds/hiperiso/src/gui/Web -I/mnt/data/Builds/hiperiso/src/gui/QT -I/mnt/data/Builds/hiperiso/src/gui/Include -I/mnt/data/Builds/hiperiso/src/gui/Lib/libhttp/include -I/mnt/data/Builds/hiperiso/src/gui/Lib/fat_io_lib/include -I/mnt/data/Builds/hiperiso/src/gui/Lib/xz-embedded/linux/include -I/mnt/data/Builds/hiperiso/src/gui/Lib/xz-embedded/linux/include/linux -I/mnt/data/Builds/hiperiso/src/gui/Lib/xz-embedded/userspace -I/mnt/data/Builds/hiperiso/src/gui/Lib/exfat/src/libexfat -I/mnt/data/Builds/hiperiso/src/gui/Lib/fat_io_lib -I/usr/include/qt -I/usr/include/qt/QtWidgets -I/usr/include/qt/QtGui -I/usr/include/qt/QtCore -I. -I/usr/include/c++/16.1.1 -I/usr/include/c++/16.1.1/x86_64-pc-linux-gnu -I/usr/include/c++/16.1.1/backward -I/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include -I/usr/local/include -I/usr/include ../hiperiso2diskwindow.h -o moc_hiperiso2diskwindow.cpp + +compiler_moc_objc_header_make_all: +compiler_moc_objc_header_clean: +compiler_moc_source_make_all: +compiler_moc_source_clean: +compiler_uic_make_all: ui_partcfgdialog.h ui_hiperiso2diskwindow.h +compiler_uic_clean: + -$(DEL_FILE) ui_partcfgdialog.h ui_hiperiso2diskwindow.h +ui_partcfgdialog.h: ../partcfgdialog.ui \ + /usr/bin/uic + /usr/bin/uic ../partcfgdialog.ui -o ui_partcfgdialog.h + +ui_hiperiso2diskwindow.h: ../hiperiso2diskwindow.ui \ + /usr/bin/uic + /usr/bin/uic ../hiperiso2diskwindow.ui -o ui_hiperiso2diskwindow.h + +compiler_yacc_decl_make_all: +compiler_yacc_decl_clean: +compiler_yacc_impl_make_all: +compiler_yacc_impl_clean: +compiler_lex_make_all: +compiler_lex_clean: +compiler_clean: compiler_moc_predefs_clean compiler_moc_header_clean compiler_uic_clean + +####### Compile + +hiperiso_crc32.o: ../../Core/hiperiso_crc32.c + $(CC) -c $(CFLAGS) $(INCPATH) -o hiperiso_crc32.o ../../Core/hiperiso_crc32.c + +hiperiso_disk.o: ../../Core/hiperiso_disk.c ../../Core/hiperiso_define.h \ + ../../Core/hiperiso_disk.h \ + ../../Core/hiperiso_util.h \ + ../../Lib/fat_io_lib/fat_filelib.h \ + ../../Lib/fat_io_lib/fat_opts.h \ + ../../Lib/fat_io_lib/fat_access.h \ + ../../Lib/fat_io_lib/fat_defs.h \ + ../../Lib/fat_io_lib/fat_types.h \ + ../../Lib/fat_io_lib/fat_list.h + $(CC) -c $(CFLAGS) $(INCPATH) -o hiperiso_disk.o ../../Core/hiperiso_disk.c + +hiperiso_json.o: ../../Core/hiperiso_json.c ../../Core/hiperiso_define.h \ + ../../Core/hiperiso_util.h \ + ../../Core/hiperiso_json.h + $(CC) -c $(CFLAGS) $(INCPATH) -o hiperiso_json.o ../../Core/hiperiso_json.c + +hiperiso_log.o: ../../Core/hiperiso_log.c ../../Core/hiperiso_define.h + $(CC) -c $(CFLAGS) $(INCPATH) -o hiperiso_log.o ../../Core/hiperiso_log.c + +hiperiso_md5.o: ../../Core/hiperiso_md5.c + $(CC) -c $(CFLAGS) $(INCPATH) -o hiperiso_md5.o ../../Core/hiperiso_md5.c + +hiperiso_util.o: ../../Core/hiperiso_util.c ../../Core/hiperiso_define.h \ + ../../Core/hiperiso_util.h + $(CC) -c $(CFLAGS) $(INCPATH) -o hiperiso_util.o ../../Core/hiperiso_util.c + +cluster.o: ../../Lib/exfat/src/libexfat/cluster.c ../../Lib/exfat/src/libexfat/exfat.h \ + ../../Lib/exfat/src/libexfat/config.h \ + ../../Lib/exfat/src/libexfat/compiler.h \ + ../../Lib/exfat/src/libexfat/exfatfs.h \ + ../../Lib/exfat/src/libexfat/byteorder.h \ + ../../Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o cluster.o ../../Lib/exfat/src/libexfat/cluster.c + +io.o: ../../Lib/exfat/src/libexfat/io.c ../../Lib/exfat/src/libexfat/exfat.h \ + ../../Lib/exfat/src/libexfat/config.h \ + ../../Lib/exfat/src/libexfat/compiler.h \ + ../../Lib/exfat/src/libexfat/exfatfs.h \ + ../../Lib/exfat/src/libexfat/byteorder.h \ + ../../Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o io.o ../../Lib/exfat/src/libexfat/io.c + +lookup.o: ../../Lib/exfat/src/libexfat/lookup.c ../../Lib/exfat/src/libexfat/exfat.h \ + ../../Lib/exfat/src/libexfat/config.h \ + ../../Lib/exfat/src/libexfat/compiler.h \ + ../../Lib/exfat/src/libexfat/exfatfs.h \ + ../../Lib/exfat/src/libexfat/byteorder.h \ + ../../Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o lookup.o ../../Lib/exfat/src/libexfat/lookup.c + +mount.o: ../../Lib/exfat/src/libexfat/mount.c ../../Lib/exfat/src/libexfat/exfat.h \ + ../../Lib/exfat/src/libexfat/config.h \ + ../../Lib/exfat/src/libexfat/compiler.h \ + ../../Lib/exfat/src/libexfat/exfatfs.h \ + ../../Lib/exfat/src/libexfat/byteorder.h \ + ../../Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o mount.o ../../Lib/exfat/src/libexfat/mount.c + +node.o: ../../Lib/exfat/src/libexfat/node.c ../../Lib/exfat/src/libexfat/exfat.h \ + ../../Lib/exfat/src/libexfat/config.h \ + ../../Lib/exfat/src/libexfat/compiler.h \ + ../../Lib/exfat/src/libexfat/exfatfs.h \ + ../../Lib/exfat/src/libexfat/byteorder.h \ + ../../Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o node.o ../../Lib/exfat/src/libexfat/node.c + +repair.o: ../../Lib/exfat/src/libexfat/repair.c ../../Lib/exfat/src/libexfat/exfat.h \ + ../../Lib/exfat/src/libexfat/config.h \ + ../../Lib/exfat/src/libexfat/compiler.h \ + ../../Lib/exfat/src/libexfat/exfatfs.h \ + ../../Lib/exfat/src/libexfat/byteorder.h \ + ../../Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o repair.o ../../Lib/exfat/src/libexfat/repair.c + +time.o: ../../Lib/exfat/src/libexfat/time.c ../../Lib/exfat/src/libexfat/exfat.h \ + ../../Lib/exfat/src/libexfat/config.h \ + ../../Lib/exfat/src/libexfat/compiler.h \ + ../../Lib/exfat/src/libexfat/exfatfs.h \ + ../../Lib/exfat/src/libexfat/byteorder.h \ + ../../Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o time.o ../../Lib/exfat/src/libexfat/time.c + +utf.o: ../../Lib/exfat/src/libexfat/utf.c ../../Lib/exfat/src/libexfat/exfat.h \ + ../../Lib/exfat/src/libexfat/config.h \ + ../../Lib/exfat/src/libexfat/compiler.h \ + ../../Lib/exfat/src/libexfat/exfatfs.h \ + ../../Lib/exfat/src/libexfat/byteorder.h \ + ../../Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o utf.o ../../Lib/exfat/src/libexfat/utf.c + +utils.o: ../../Lib/exfat/src/libexfat/utils.c ../../Lib/exfat/src/libexfat/exfat.h \ + ../../Lib/exfat/src/libexfat/config.h \ + ../../Lib/exfat/src/libexfat/compiler.h \ + ../../Lib/exfat/src/libexfat/exfatfs.h \ + ../../Lib/exfat/src/libexfat/byteorder.h \ + ../../Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o utils.o ../../Lib/exfat/src/libexfat/utils.c + +cbm.o: ../../Lib/exfat/src/mkfs/cbm.c ../../Lib/exfat/src/mkfs/cbm.h \ + ../../Lib/exfat/src/mkfs/mkexfat.h \ + ../../Lib/exfat/src/libexfat/exfat.h \ + ../../Lib/exfat/src/libexfat/config.h \ + ../../Lib/exfat/src/libexfat/compiler.h \ + ../../Lib/exfat/src/libexfat/exfatfs.h \ + ../../Lib/exfat/src/libexfat/byteorder.h \ + ../../Lib/exfat/src/libexfat/platform.h \ + ../../Lib/exfat/src/mkfs/fat.h \ + ../../Lib/exfat/src/mkfs/uct.h \ + ../../Lib/exfat/src/mkfs/rootdir.h + $(CC) -c $(CFLAGS) $(INCPATH) -o cbm.o ../../Lib/exfat/src/mkfs/cbm.c + +fat.o: ../../Lib/exfat/src/mkfs/fat.c ../../Lib/exfat/src/mkfs/fat.h \ + ../../Lib/exfat/src/mkfs/mkexfat.h \ + ../../Lib/exfat/src/libexfat/exfat.h \ + ../../Lib/exfat/src/libexfat/config.h \ + ../../Lib/exfat/src/libexfat/compiler.h \ + ../../Lib/exfat/src/libexfat/exfatfs.h \ + ../../Lib/exfat/src/libexfat/byteorder.h \ + ../../Lib/exfat/src/libexfat/platform.h \ + ../../Lib/exfat/src/mkfs/cbm.h \ + ../../Lib/exfat/src/mkfs/uct.h \ + ../../Lib/exfat/src/mkfs/rootdir.h + $(CC) -c $(CFLAGS) $(INCPATH) -o fat.o ../../Lib/exfat/src/mkfs/fat.c + +mkexfat.o: ../../Lib/exfat/src/mkfs/mkexfat.c ../../Lib/exfat/src/mkfs/mkexfat.h \ + ../../Lib/exfat/src/libexfat/exfat.h \ + ../../Lib/exfat/src/libexfat/config.h \ + ../../Lib/exfat/src/libexfat/compiler.h \ + ../../Lib/exfat/src/libexfat/exfatfs.h \ + ../../Lib/exfat/src/libexfat/byteorder.h \ + ../../Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o mkexfat.o ../../Lib/exfat/src/mkfs/mkexfat.c + +mkexfat_main.o: ../../Lib/exfat/src/mkfs/mkexfat_main.c ../../Lib/exfat/src/mkfs/mkexfat.h \ + ../../Lib/exfat/src/libexfat/exfat.h \ + ../../Lib/exfat/src/libexfat/config.h \ + ../../Lib/exfat/src/libexfat/compiler.h \ + ../../Lib/exfat/src/libexfat/exfatfs.h \ + ../../Lib/exfat/src/libexfat/byteorder.h \ + ../../Lib/exfat/src/libexfat/platform.h \ + ../../Lib/exfat/src/mkfs/vbr.h \ + ../../Lib/exfat/src/mkfs/fat.h \ + ../../Lib/exfat/src/mkfs/cbm.h \ + ../../Lib/exfat/src/mkfs/uct.h \ + ../../Lib/exfat/src/mkfs/rootdir.h + $(CC) -c $(CFLAGS) $(INCPATH) -o mkexfat_main.o ../../Lib/exfat/src/mkfs/mkexfat_main.c + +rootdir.o: ../../Lib/exfat/src/mkfs/rootdir.c ../../Lib/exfat/src/mkfs/rootdir.h \ + ../../Lib/exfat/src/mkfs/mkexfat.h \ + ../../Lib/exfat/src/libexfat/exfat.h \ + ../../Lib/exfat/src/libexfat/config.h \ + ../../Lib/exfat/src/libexfat/compiler.h \ + ../../Lib/exfat/src/libexfat/exfatfs.h \ + ../../Lib/exfat/src/libexfat/byteorder.h \ + ../../Lib/exfat/src/libexfat/platform.h \ + ../../Lib/exfat/src/mkfs/uct.h \ + ../../Lib/exfat/src/mkfs/cbm.h \ + ../../Lib/exfat/src/mkfs/uctc.h + $(CC) -c $(CFLAGS) $(INCPATH) -o rootdir.o ../../Lib/exfat/src/mkfs/rootdir.c + +uct.o: ../../Lib/exfat/src/mkfs/uct.c ../../Lib/exfat/src/mkfs/uct.h \ + ../../Lib/exfat/src/mkfs/mkexfat.h \ + ../../Lib/exfat/src/libexfat/exfat.h \ + ../../Lib/exfat/src/libexfat/config.h \ + ../../Lib/exfat/src/libexfat/compiler.h \ + ../../Lib/exfat/src/libexfat/exfatfs.h \ + ../../Lib/exfat/src/libexfat/byteorder.h \ + ../../Lib/exfat/src/libexfat/platform.h \ + ../../Lib/exfat/src/mkfs/uctc.h + $(CC) -c $(CFLAGS) $(INCPATH) -o uct.o ../../Lib/exfat/src/mkfs/uct.c + +uctc.o: ../../Lib/exfat/src/mkfs/uctc.c ../../Lib/exfat/src/mkfs/uctc.h + $(CC) -c $(CFLAGS) $(INCPATH) -o uctc.o ../../Lib/exfat/src/mkfs/uctc.c + +vbr.o: ../../Lib/exfat/src/mkfs/vbr.c ../../Lib/exfat/src/mkfs/vbr.h \ + ../../Lib/exfat/src/mkfs/mkexfat.h \ + ../../Lib/exfat/src/libexfat/exfat.h \ + ../../Lib/exfat/src/libexfat/config.h \ + ../../Lib/exfat/src/libexfat/compiler.h \ + ../../Lib/exfat/src/libexfat/exfatfs.h \ + ../../Lib/exfat/src/libexfat/byteorder.h \ + ../../Lib/exfat/src/libexfat/platform.h \ + ../../Lib/exfat/src/mkfs/fat.h \ + ../../Lib/exfat/src/mkfs/cbm.h \ + ../../Lib/exfat/src/mkfs/uct.h \ + ../../Lib/exfat/src/mkfs/rootdir.h + $(CC) -c $(CFLAGS) $(INCPATH) -o vbr.o ../../Lib/exfat/src/mkfs/vbr.c + +fat_access.o: ../../Lib/fat_io_lib/fat_access.c ../../Lib/fat_io_lib/fat_defs.h \ + ../../Lib/fat_io_lib/fat_opts.h \ + ../../Lib/fat_io_lib/fat_types.h \ + ../../Lib/fat_io_lib/fat_access.h \ + ../../Lib/fat_io_lib/fat_table.h \ + ../../Lib/fat_io_lib/fat_misc.h \ + ../../Lib/fat_io_lib/fat_write.h \ + ../../Lib/fat_io_lib/fat_string.h + $(CC) -c $(CFLAGS) $(INCPATH) -o fat_access.o ../../Lib/fat_io_lib/fat_access.c + +fat_cache.o: ../../Lib/fat_io_lib/fat_cache.c ../../Lib/fat_io_lib/fat_cache.h \ + ../../Lib/fat_io_lib/fat_filelib.h \ + ../../Lib/fat_io_lib/fat_opts.h \ + ../../Lib/fat_io_lib/fat_access.h \ + ../../Lib/fat_io_lib/fat_defs.h \ + ../../Lib/fat_io_lib/fat_types.h \ + ../../Lib/fat_io_lib/fat_list.h + $(CC) -c $(CFLAGS) $(INCPATH) -o fat_cache.o ../../Lib/fat_io_lib/fat_cache.c + +fat_filelib.o: ../../Lib/fat_io_lib/fat_filelib.c ../../Lib/fat_io_lib/fat_defs.h \ + ../../Lib/fat_io_lib/fat_opts.h \ + ../../Lib/fat_io_lib/fat_types.h \ + ../../Lib/fat_io_lib/fat_access.h \ + ../../Lib/fat_io_lib/fat_table.h \ + ../../Lib/fat_io_lib/fat_misc.h \ + ../../Lib/fat_io_lib/fat_write.h \ + ../../Lib/fat_io_lib/fat_string.h \ + ../../Lib/fat_io_lib/fat_filelib.h \ + ../../Lib/fat_io_lib/fat_list.h \ + ../../Lib/fat_io_lib/fat_cache.h + $(CC) -c $(CFLAGS) $(INCPATH) -o fat_filelib.o ../../Lib/fat_io_lib/fat_filelib.c + +fat_format.o: ../../Lib/fat_io_lib/fat_format.c ../../Lib/fat_io_lib/fat_defs.h \ + ../../Lib/fat_io_lib/fat_opts.h \ + ../../Lib/fat_io_lib/fat_types.h \ + ../../Lib/fat_io_lib/fat_access.h \ + ../../Lib/fat_io_lib/fat_table.h \ + ../../Lib/fat_io_lib/fat_misc.h \ + ../../Lib/fat_io_lib/fat_write.h \ + ../../Lib/fat_io_lib/fat_string.h \ + ../../Lib/fat_io_lib/fat_format.h + $(CC) -c $(CFLAGS) $(INCPATH) -o fat_format.o ../../Lib/fat_io_lib/fat_format.c + +fat_misc.o: ../../Lib/fat_io_lib/fat_misc.c ../../Lib/fat_io_lib/fat_misc.h \ + ../../Lib/fat_io_lib/fat_defs.h \ + ../../Lib/fat_io_lib/fat_opts.h \ + ../../Lib/fat_io_lib/fat_types.h + $(CC) -c $(CFLAGS) $(INCPATH) -o fat_misc.o ../../Lib/fat_io_lib/fat_misc.c + +fat_string.o: ../../Lib/fat_io_lib/fat_string.c ../../Lib/fat_io_lib/fat_string.h + $(CC) -c $(CFLAGS) $(INCPATH) -o fat_string.o ../../Lib/fat_io_lib/fat_string.c + +fat_table.o: ../../Lib/fat_io_lib/fat_table.c ../../Lib/fat_io_lib/fat_defs.h \ + ../../Lib/fat_io_lib/fat_opts.h \ + ../../Lib/fat_io_lib/fat_types.h \ + ../../Lib/fat_io_lib/fat_access.h \ + ../../Lib/fat_io_lib/fat_table.h \ + ../../Lib/fat_io_lib/fat_misc.h + $(CC) -c $(CFLAGS) $(INCPATH) -o fat_table.o ../../Lib/fat_io_lib/fat_table.c + +fat_write.o: ../../Lib/fat_io_lib/fat_write.c ../../Lib/fat_io_lib/fat_defs.h \ + ../../Lib/fat_io_lib/fat_opts.h \ + ../../Lib/fat_io_lib/fat_types.h \ + ../../Lib/fat_io_lib/fat_access.h \ + ../../Lib/fat_io_lib/fat_table.h \ + ../../Lib/fat_io_lib/fat_misc.h \ + ../../Lib/fat_io_lib/fat_write.h \ + ../../Lib/fat_io_lib/fat_string.h + $(CC) -c $(CFLAGS) $(INCPATH) -o fat_write.o ../../Lib/fat_io_lib/fat_write.c + +decompress_unxz.o: ../../Lib/xz-embedded/linux/lib/decompress_unxz.c ../../Lib/xz-embedded/linux/include/linux/xz.h \ + ../../Lib/xz-embedded/linux/lib/xz/xz_private.h \ + ../../Lib/xz-embedded/userspace/xz_config.h \ + ../../Lib/xz-embedded/linux/lib/xz/xz_crc32.c \ + ../../Lib/xz-embedded/linux/lib/xz/xz_dec_stream.c \ + ../../Lib/xz-embedded/linux/lib/xz/xz_stream.h \ + ../../Lib/xz-embedded/linux/lib/xz/xz_dec_lzma2.c \ + ../../Lib/xz-embedded/linux/lib/xz/xz_lzma2.h \ + ../../Lib/xz-embedded/linux/lib/xz/xz_dec_bcj.c + $(CC) -c $(CFLAGS) $(INCPATH) -o decompress_unxz.o ../../Lib/xz-embedded/linux/lib/decompress_unxz.c + +refresh_icon_data.o: ../refresh_icon_data.c + $(CC) -c $(CFLAGS) $(INCPATH) -o refresh_icon_data.o ../refresh_icon_data.c + +secure_icon_data.o: ../secure_icon_data.c + $(CC) -c $(CFLAGS) $(INCPATH) -o secure_icon_data.o ../secure_icon_data.c + +hiperiso_qt_stub.o: ../hiperiso_qt_stub.c ../../Core/hiperiso_define.h \ + ../../Core/hiperiso_json.h \ + ../../Core/hiperiso_util.h \ + ../../Core/hiperiso_disk.h \ + ../../Web/hiperiso_http.h \ + ../../Lib/libhttp/include/civetweb.h + $(CC) -c $(CFLAGS) $(INCPATH) -o hiperiso_qt_stub.o ../hiperiso_qt_stub.c + +hiperiso_http.o: ../../Web/hiperiso_http.c ../../Core/hiperiso_define.h \ + ../../Core/hiperiso_json.h \ + ../../Core/hiperiso_util.h \ + ../../Core/hiperiso_disk.h \ + ../../Web/hiperiso_http.h \ + ../../Lib/libhttp/include/civetweb.h \ + ../../Lib/fat_io_lib/fat_filelib.h \ + ../../Lib/fat_io_lib/fat_opts.h \ + ../../Lib/fat_io_lib/fat_access.h \ + ../../Lib/fat_io_lib/fat_defs.h \ + ../../Lib/fat_io_lib/fat_types.h \ + ../../Lib/fat_io_lib/fat_list.h + $(CC) -c $(CFLAGS) $(INCPATH) -o hiperiso_http.o ../../Web/hiperiso_http.c + +main.o: ../main.cpp ../hiperiso2diskwindow.h \ + ../partcfgdialog.h \ + ../../Core/hiperiso_define.h \ + ../../Core/hiperiso_util.h \ + ../hiperiso_qt.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o main.o ../main.cpp + +partcfgdialog.o: ../partcfgdialog.cpp ../partcfgdialog.h \ + ../ui_partcfgdialog.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o partcfgdialog.o ../partcfgdialog.cpp + +hiperiso2diskwindow.o: ../hiperiso2diskwindow.cpp ../hiperiso2diskwindow.h \ + ../partcfgdialog.h \ + ../ui_hiperiso2diskwindow.h \ + ../../Core/hiperiso_define.h \ + ../../Core/hiperiso_util.h \ + ../../Core/hiperiso_disk.h \ + ../../Core/hiperiso_json.h \ + ../../Web/hiperiso_http.h \ + ../../Lib/libhttp/include/civetweb.h \ + ../hiperiso_qt.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o hiperiso2diskwindow.o ../hiperiso2diskwindow.cpp + +moc_partcfgdialog.o: moc_partcfgdialog.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_partcfgdialog.o moc_partcfgdialog.cpp + +moc_hiperiso2diskwindow.o: moc_hiperiso2diskwindow.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_hiperiso2diskwindow.o moc_hiperiso2diskwindow.cpp + +####### Install + +install_target: first FORCE + @test -d $(INSTALL_ROOT)/opt/Hiperiso2Disk/bin || mkdir -p $(INSTALL_ROOT)/opt/Hiperiso2Disk/bin + $(QINSTALL_PROGRAM) $(QMAKE_TARGET) $(INSTALL_ROOT)/opt/Hiperiso2Disk/bin/$(QMAKE_TARGET) + +uninstall_target: FORCE + -$(DEL_FILE) $(INSTALL_ROOT)/opt/Hiperiso2Disk/bin/$(QMAKE_TARGET) + -$(DEL_DIR) $(INSTALL_ROOT)/opt/Hiperiso2Disk/bin/ + + +install: install_target FORCE + +uninstall: uninstall_target FORCE + +FORCE: + diff --git a/src/gui/QT/build_output/moc_hiperiso2diskwindow.cpp b/src/gui/QT/build_output/moc_hiperiso2diskwindow.cpp new file mode 100644 index 0000000..98ebdc0 --- /dev/null +++ b/src/gui/QT/build_output/moc_hiperiso2diskwindow.cpp @@ -0,0 +1,312 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'hiperiso2diskwindow.h' +** +** Created by: The Qt Meta Object Compiler version 67 (Qt 5.15.19) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include +#include "../hiperiso2diskwindow.h" +#include +#include +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'hiperiso2diskwindow.h' doesn't include ." +#elif Q_MOC_OUTPUT_REVISION != 67 +#error "This file was generated using the moc from 5.15.19. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +QT_WARNING_PUSH +QT_WARNING_DISABLE_DEPRECATED +struct qt_meta_stringdata_MyQThread_t { + QByteArrayData data[5]; + char stringdata0[33]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_MyQThread_t, stringdata0) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_MyQThread_t qt_meta_stringdata_MyQThread = { + { +QT_MOC_LITERAL(0, 0, 9), // "MyQThread" +QT_MOC_LITERAL(1, 10, 12), // "thread_event" +QT_MOC_LITERAL(2, 23, 0), // "" +QT_MOC_LITERAL(3, 24, 3), // "msg" +QT_MOC_LITERAL(4, 28, 4) // "data" + + }, + "MyQThread\0thread_event\0\0msg\0data" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_MyQThread[] = { + + // content: + 8, // revision + 0, // classname + 0, 0, // classinfo + 1, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 1, // signalCount + + // signals: name, argc, parameters, tag, flags + 1, 2, 19, 2, 0x06 /* Public */, + + // signals: parameters + QMetaType::Void, QMetaType::Int, QMetaType::Int, 3, 4, + + 0 // eod +}; + +void MyQThread::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + auto *_t = static_cast(_o); + (void)_t; + switch (_id) { + case 0: _t->thread_event((*reinterpret_cast< int(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2]))); break; + default: ; + } + } else if (_c == QMetaObject::IndexOfMethod) { + int *result = reinterpret_cast(_a[0]); + { + using _t = void (MyQThread::*)(int , int ); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&MyQThread::thread_event)) { + *result = 0; + return; + } + } + } +} + +QT_INIT_METAOBJECT const QMetaObject MyQThread::staticMetaObject = { { + QMetaObject::SuperData::link(), + qt_meta_stringdata_MyQThread.data, + qt_meta_data_MyQThread, + qt_static_metacall, + nullptr, + nullptr +} }; + + +const QMetaObject *MyQThread::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *MyQThread::qt_metacast(const char *_clname) +{ + if (!_clname) return nullptr; + if (!strcmp(_clname, qt_meta_stringdata_MyQThread.stringdata0)) + return static_cast(this); + return QThread::qt_metacast(_clname); +} + +int MyQThread::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QThread::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 1) + qt_static_metacall(this, _c, _id, _a); + _id -= 1; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 1) + *reinterpret_cast(_a[0]) = -1; + _id -= 1; + } + return _id; +} + +// SIGNAL 0 +void MyQThread::thread_event(int _t1, int _t2) +{ + void *_a[] = { nullptr, const_cast(reinterpret_cast(std::addressof(_t1))), const_cast(reinterpret_cast(std::addressof(_t2))) }; + QMetaObject::activate(this, &staticMetaObject, 0, _a); +} +struct qt_meta_stringdata_Hiperiso2DiskWindow_t { + QByteArrayData data[21]; + char stringdata0[439]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_Hiperiso2DiskWindow_t, stringdata0) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_Hiperiso2DiskWindow_t qt_meta_stringdata_Hiperiso2DiskWindow = { + { +QT_MOC_LITERAL(0, 0, 19), // "Hiperiso2DiskWindow" +QT_MOC_LITERAL(1, 20, 12), // "thread_event" +QT_MOC_LITERAL(2, 33, 0), // "" +QT_MOC_LITERAL(3, 34, 3), // "msg" +QT_MOC_LITERAL(4, 38, 4), // "data" +QT_MOC_LITERAL(5, 43, 23), // "part_style_check_action" +QT_MOC_LITERAL(6, 67, 8), // "QAction*" +QT_MOC_LITERAL(7, 76, 3), // "act" +QT_MOC_LITERAL(8, 80, 17), // "lang_check_action" +QT_MOC_LITERAL(9, 98, 24), // "on_ButtonInstall_clicked" +QT_MOC_LITERAL(10, 123, 23), // "on_ButtonUpdate_clicked" +QT_MOC_LITERAL(11, 147, 24), // "on_ButtonRefresh_clicked" +QT_MOC_LITERAL(12, 172, 37), // "on_comboBoxDevice_currentInde..." +QT_MOC_LITERAL(13, 210, 5), // "index" +QT_MOC_LITERAL(14, 216, 42), // "on_actionPartition_Configurat..." +QT_MOC_LITERAL(15, 259, 33), // "on_actionClear_Hiperiso_trigg..." +QT_MOC_LITERAL(16, 293, 33), // "on_actionShow_All_Devices_tog..." +QT_MOC_LITERAL(17, 327, 4), // "arg1" +QT_MOC_LITERAL(18, 332, 38), // "on_actionSecure_Boot_Support_..." +QT_MOC_LITERAL(19, 371, 42), // "on_actionInstall_Non_Destruct..." +QT_MOC_LITERAL(20, 414, 24) // "on_actionAbout_triggered" + + }, + "Hiperiso2DiskWindow\0thread_event\0\0msg\0" + "data\0part_style_check_action\0QAction*\0" + "act\0lang_check_action\0on_ButtonInstall_clicked\0" + "on_ButtonUpdate_clicked\0" + "on_ButtonRefresh_clicked\0" + "on_comboBoxDevice_currentIndexChanged\0" + "index\0on_actionPartition_Configuration_triggered\0" + "on_actionClear_Hiperiso_triggered\0" + "on_actionShow_All_Devices_toggled\0" + "arg1\0on_actionSecure_Boot_Support_triggered\0" + "on_actionInstall_Non_Destructive_triggered\0" + "on_actionAbout_triggered" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_Hiperiso2DiskWindow[] = { + + // content: + 8, // revision + 0, // classname + 0, 0, // classinfo + 13, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 0, // signalCount + + // slots: name, argc, parameters, tag, flags + 1, 2, 79, 2, 0x08 /* Private */, + 5, 1, 84, 2, 0x08 /* Private */, + 8, 1, 87, 2, 0x08 /* Private */, + 9, 0, 90, 2, 0x08 /* Private */, + 10, 0, 91, 2, 0x08 /* Private */, + 11, 0, 92, 2, 0x08 /* Private */, + 12, 1, 93, 2, 0x08 /* Private */, + 14, 0, 96, 2, 0x08 /* Private */, + 15, 0, 97, 2, 0x08 /* Private */, + 16, 1, 98, 2, 0x08 /* Private */, + 18, 0, 101, 2, 0x08 /* Private */, + 19, 0, 102, 2, 0x08 /* Private */, + 20, 0, 103, 2, 0x08 /* Private */, + + // slots: parameters + QMetaType::Void, QMetaType::Int, QMetaType::Int, 3, 4, + QMetaType::Void, 0x80000000 | 6, 7, + QMetaType::Void, 0x80000000 | 6, 7, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, QMetaType::Int, 13, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, QMetaType::Bool, 17, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + + 0 // eod +}; + +void Hiperiso2DiskWindow::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + auto *_t = static_cast(_o); + (void)_t; + switch (_id) { + case 0: _t->thread_event((*reinterpret_cast< int(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2]))); break; + case 1: _t->part_style_check_action((*reinterpret_cast< QAction*(*)>(_a[1]))); break; + case 2: _t->lang_check_action((*reinterpret_cast< QAction*(*)>(_a[1]))); break; + case 3: _t->on_ButtonInstall_clicked(); break; + case 4: _t->on_ButtonUpdate_clicked(); break; + case 5: _t->on_ButtonRefresh_clicked(); break; + case 6: _t->on_comboBoxDevice_currentIndexChanged((*reinterpret_cast< int(*)>(_a[1]))); break; + case 7: _t->on_actionPartition_Configuration_triggered(); break; + case 8: _t->on_actionClear_Hiperiso_triggered(); break; + case 9: _t->on_actionShow_All_Devices_toggled((*reinterpret_cast< bool(*)>(_a[1]))); break; + case 10: _t->on_actionSecure_Boot_Support_triggered(); break; + case 11: _t->on_actionInstall_Non_Destructive_triggered(); break; + case 12: _t->on_actionAbout_triggered(); break; + default: ; + } + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + switch (_id) { + default: *reinterpret_cast(_a[0]) = -1; break; + case 1: + switch (*reinterpret_cast(_a[1])) { + default: *reinterpret_cast(_a[0]) = -1; break; + case 0: + *reinterpret_cast(_a[0]) = qRegisterMetaType< QAction* >(); break; + } + break; + case 2: + switch (*reinterpret_cast(_a[1])) { + default: *reinterpret_cast(_a[0]) = -1; break; + case 0: + *reinterpret_cast(_a[0]) = qRegisterMetaType< QAction* >(); break; + } + break; + } + } +} + +QT_INIT_METAOBJECT const QMetaObject Hiperiso2DiskWindow::staticMetaObject = { { + QMetaObject::SuperData::link(), + qt_meta_stringdata_Hiperiso2DiskWindow.data, + qt_meta_data_Hiperiso2DiskWindow, + qt_static_metacall, + nullptr, + nullptr +} }; + + +const QMetaObject *Hiperiso2DiskWindow::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *Hiperiso2DiskWindow::qt_metacast(const char *_clname) +{ + if (!_clname) return nullptr; + if (!strcmp(_clname, qt_meta_stringdata_Hiperiso2DiskWindow.stringdata0)) + return static_cast(this); + return QMainWindow::qt_metacast(_clname); +} + +int Hiperiso2DiskWindow::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QMainWindow::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 13) + qt_static_metacall(this, _c, _id, _a); + _id -= 13; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 13) + qt_static_metacall(this, _c, _id, _a); + _id -= 13; + } + return _id; +} +QT_WARNING_POP +QT_END_MOC_NAMESPACE diff --git a/src/gui/QT/build_output/moc_partcfgdialog.cpp b/src/gui/QT/build_output/moc_partcfgdialog.cpp new file mode 100644 index 0000000..4d616d3 --- /dev/null +++ b/src/gui/QT/build_output/moc_partcfgdialog.cpp @@ -0,0 +1,129 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'partcfgdialog.h' +** +** Created by: The Qt Meta Object Compiler version 67 (Qt 5.15.19) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include +#include "../partcfgdialog.h" +#include +#include +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'partcfgdialog.h' doesn't include ." +#elif Q_MOC_OUTPUT_REVISION != 67 +#error "This file was generated using the moc from 5.15.19. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +QT_WARNING_PUSH +QT_WARNING_DISABLE_DEPRECATED +struct qt_meta_stringdata_PartCfgDialog_t { + QByteArrayData data[6]; + char stringdata0[97]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_PartCfgDialog_t, stringdata0) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_PartCfgDialog_t qt_meta_stringdata_PartCfgDialog = { + { +QT_MOC_LITERAL(0, 0, 13), // "PartCfgDialog" +QT_MOC_LITERAL(1, 14, 23), // "on_pushButtonOK_clicked" +QT_MOC_LITERAL(2, 38, 0), // "" +QT_MOC_LITERAL(3, 39, 27), // "on_pushButtonCancel_clicked" +QT_MOC_LITERAL(4, 67, 24), // "on_checkBox_stateChanged" +QT_MOC_LITERAL(5, 92, 4) // "arg1" + + }, + "PartCfgDialog\0on_pushButtonOK_clicked\0" + "\0on_pushButtonCancel_clicked\0" + "on_checkBox_stateChanged\0arg1" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_PartCfgDialog[] = { + + // content: + 8, // revision + 0, // classname + 0, 0, // classinfo + 3, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 0, // signalCount + + // slots: name, argc, parameters, tag, flags + 1, 0, 29, 2, 0x08 /* Private */, + 3, 0, 30, 2, 0x08 /* Private */, + 4, 1, 31, 2, 0x08 /* Private */, + + // slots: parameters + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, QMetaType::Int, 5, + + 0 // eod +}; + +void PartCfgDialog::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + auto *_t = static_cast(_o); + (void)_t; + switch (_id) { + case 0: _t->on_pushButtonOK_clicked(); break; + case 1: _t->on_pushButtonCancel_clicked(); break; + case 2: _t->on_checkBox_stateChanged((*reinterpret_cast< int(*)>(_a[1]))); break; + default: ; + } + } +} + +QT_INIT_METAOBJECT const QMetaObject PartCfgDialog::staticMetaObject = { { + QMetaObject::SuperData::link(), + qt_meta_stringdata_PartCfgDialog.data, + qt_meta_data_PartCfgDialog, + qt_static_metacall, + nullptr, + nullptr +} }; + + +const QMetaObject *PartCfgDialog::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *PartCfgDialog::qt_metacast(const char *_clname) +{ + if (!_clname) return nullptr; + if (!strcmp(_clname, qt_meta_stringdata_PartCfgDialog.stringdata0)) + return static_cast(this); + return QDialog::qt_metacast(_clname); +} + +int PartCfgDialog::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QDialog::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 3) + qt_static_metacall(this, _c, _id, _a); + _id -= 3; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 3) + *reinterpret_cast(_a[0]) = -1; + _id -= 3; + } + return _id; +} +QT_WARNING_POP +QT_END_MOC_NAMESPACE diff --git a/src/gui/QT/build_output/moc_predefs.h b/src/gui/QT/build_output/moc_predefs.h new file mode 100644 index 0000000..b38b876 --- /dev/null +++ b/src/gui/QT/build_output/moc_predefs.h @@ -0,0 +1,446 @@ +#define __DBL_MIN_EXP__ (-1021) +#define __LDBL_MANT_DIG__ 64 +#define __UINT_LEAST16_MAX__ 0xffff +#define __FLT16_HAS_QUIET_NAN__ 1 +#define __ATOMIC_ACQUIRE 2 +#define __FLT128_MAX_10_EXP__ 4932 +#define __FLT_MIN__ 1.17549435082228750796873653722224568e-38F +#define __GCC_IEC_559_COMPLEX 2 +#define __UINT_LEAST8_TYPE__ unsigned char +#define __SIZEOF_FLOAT80__ 16 +#define __BFLT16_DENORM_MIN__ 9.18354961579912115600575419704879436e-41BF16 +#define __INTMAX_C(c) c ## L +#define __CHAR_BIT__ 8 +#define __UINT8_MAX__ 0xff +#define __SCHAR_WIDTH__ 8 +#define __WINT_MAX__ 0xffffffffU +#define __FLT32_MIN_EXP__ (-125) +#define __cpp_static_assert 200410L +#define __BFLT16_MIN_10_EXP__ (-37) +#define __cpp_inheriting_constructors 201511L +#define __ORDER_LITTLE_ENDIAN__ 1234 +#define __WCHAR_MAX__ 0x7fffffff +#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1 +#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1 +#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1 +#define __GCC_ATOMIC_CHAR_LOCK_FREE 2 +#define __GCC_IEC_559 2 +#define __FLT32X_DECIMAL_DIG__ 17 +#define __FLT_EVAL_METHOD__ 0 +#define __cpp_binary_literals 201304L +#define __FLT64_DECIMAL_DIG__ 17 +#define __GCC_ATOMIC_CHAR32_T_LOCK_FREE 2 +#define __cpp_variadic_templates 200704L +#define __UINT_FAST64_MAX__ 0xffffffffffffffffUL +#define __SIG_ATOMIC_TYPE__ int +#define __DBL_MIN_10_EXP__ (-307) +#define __FINITE_MATH_ONLY__ 0 +#define __FLT32X_MAX_EXP__ 1024 +#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1 +#define __FLT32_HAS_DENORM__ 1 +#define __UINT_FAST8_MAX__ 0xff +#define __cpp_rvalue_reference 200610L +#define __FLT32_MAX_10_EXP__ 38 +#define __DEC64_MAX_EXP__ 385 +#define __INT8_C(c) c +#define __LDBL_HAS_INFINITY__ 1 +#define __INT_LEAST8_WIDTH__ 8 +#define __UINT_LEAST64_MAX__ 0xffffffffffffffffUL +#define __INT_LEAST8_MAX__ 0x7f +#define __cpp_attributes 200809L +#define __SHRT_MAX__ 0x7fff +#define __LDBL_MAX__ 1.18973149535723176502126385303097021e+4932L +#define __FLT64X_MAX_10_EXP__ 4932 +#define __BFLT16_MAX_10_EXP__ 38 +#define __BFLT16_MAX_EXP__ 128 +#define __LDBL_IS_IEC_60559__ 1 +#define __FLT64X_HAS_QUIET_NAN__ 1 +#define __UINT_LEAST8_MAX__ 0xff +#define __GCC_ATOMIC_BOOL_LOCK_FREE 2 +#define __FLT128_DENORM_MIN__ 6.47517511943802511092443895822764655e-4966F128 +#define __UINTMAX_TYPE__ long unsigned int +#define __cpp_nsdmi 200809L +#define __BFLT16_DECIMAL_DIG__ 4 +#define __linux 1 +#define __DEC32_EPSILON__ 1E-6DF +#define __FLT_EVAL_METHOD_TS_18661_3__ 0 +#define __OPTIMIZE__ 1 +#define __UINT32_MAX__ 0xffffffffU +#define __GXX_EXPERIMENTAL_CXX0X__ 1 +#define __DBL_DENORM_MIN__ double(4.94065645841246544176568792868221372e-324L) +#define __FLT128_MIN_EXP__ (-16381) +#define __DEC64X_MAX_EXP__ 6145 +#define __WINT_MIN__ 0U +#define __FLT128_MIN_10_EXP__ (-4931) +#define __FLT32X_IS_IEC_60559__ 1 +#define __INT_LEAST16_WIDTH__ 16 +#define __SCHAR_MAX__ 0x7f +#define __FLT128_MANT_DIG__ 113 +#define __WCHAR_MIN__ (-__WCHAR_MAX__ - 1) +#define __INT64_C(c) c ## L +#define __SSP_STRONG__ 3 +#define __GCC_ATOMIC_POINTER_LOCK_FREE 2 +#define __ATOMIC_SEQ_CST 5 +#define __unix 1 +#define __INT_LEAST64_MAX__ 0x7fffffffffffffffL +#define __FLT32X_MANT_DIG__ 53 +#define __GCC_ATOMIC_CHAR16_T_LOCK_FREE 2 +#define __FLT64X_EPSILON__ 1.08420217248550443400745280086994171e-19F64x +#define __STDC_HOSTED__ 1 +#define __DEC64_MIN_EXP__ (-382) +#define __DBL_DIG__ 15 +#define __STDC_EMBED_EMPTY__ 2 +#define __FLT_EPSILON__ 1.19209289550781250000000000000000000e-7F +#define __GXX_WEAK__ 1 +#define __SHRT_WIDTH__ 16 +#define __FLT32_IS_IEC_60559__ 1 +#define __LDBL_MIN__ 3.36210314311209350626267781732175260e-4932L +#define __DBL_IS_IEC_60559__ 1 +#define __DEC32_MAX__ 9.999999E96DF +#define __cpp_threadsafe_static_init 200806L +#define __FLT64X_DENORM_MIN__ 3.64519953188247460252840593361941982e-4951F64x +#define __FLT32X_HAS_INFINITY__ 1 +#define __unix__ 1 +#define __INT_WIDTH__ 32 +#define __STDC_IEC_559__ 1 +#define __STDC_ISO_10646__ 201706L +#define __DECIMAL_DIG__ 21 +#define __STDC_IEC_559_COMPLEX__ 1 +#define __gnu_linux__ 1 +#define __INT16_MAX__ 0x7fff +#define __FLT64_MIN_EXP__ (-1021) +#define __DEC64X_EPSILON__ 1E-33D64x +#define __FLT64X_MIN_10_EXP__ (-4931) +#define __LDBL_HAS_QUIET_NAN__ 1 +#define __FLT16_MIN_EXP__ (-13) +#define __FLT64_MANT_DIG__ 53 +#define __FLT64X_MANT_DIG__ 64 +#define __BFLT16_DIG__ 2 +#define __GNUC__ 16 +#define __GXX_RTTI 1 +#define __pie__ 2 +#define __MMX__ 1 +#define __FLT_HAS_DENORM__ 1 +#define __SIZEOF_LONG_DOUBLE__ 16 +#define __BIGGEST_ALIGNMENT__ 16 +#define __STDC_UTF_16__ 1 +#define __FLT64_MAX_10_EXP__ 308 +#define __BFLT16_IS_IEC_60559__ 0 +#define __FLT16_MAX_10_EXP__ 4 +#define __cpp_delegating_constructors 200604L +#define __DBL_MAX__ double(1.79769313486231570814527423731704357e+308L) +#define __cpp_raw_strings 200710L +#define __INT_FAST32_MAX__ 0x7fffffffffffffffL +#define __DBL_HAS_INFINITY__ 1 +#define __INT64_MAX__ 0x7fffffffffffffffL +#define __SIZEOF_FLOAT__ 4 +#define __HAVE_SPECULATION_SAFE_VALUE 1 +#define __DEC32_MIN_EXP__ (-94) +#define __INTPTR_WIDTH__ 64 +#define __UINT_LEAST32_MAX__ 0xffffffffU +#define __FLT32X_HAS_DENORM__ 1 +#define __INT_FAST16_TYPE__ long int +#define __MMX_WITH_SSE__ 1 +#define __LDBL_HAS_DENORM__ 1 +#define __SEG_GS 1 +#define __BFLT16_EPSILON__ 7.81250000000000000000000000000000000e-3BF16 +#define __cplusplus 201103L +#define __cpp_ref_qualifiers 200710L +#define __DEC32_MIN__ 1E-95DF +#define __DEPRECATED 1 +#define __cpp_rvalue_references 200610L +#define __DBL_MAX_EXP__ 1024 +#define __WCHAR_WIDTH__ 32 +#define __FLT32_MAX__ 3.40282346638528859811704183484516925e+38F32 +#define __DEC128_EPSILON__ 1E-33DL +#define __FLT16_DECIMAL_DIG__ 5 +#define __SSE2_MATH__ 1 +#define __ATOMIC_HLE_RELEASE 131072 +#define __PTRDIFF_MAX__ 0x7fffffffffffffffL +#define __amd64 1 +#define __DEC64X_MAX__ 9.999999999999999999999999999999999E6144D64x +#define __ATOMIC_HLE_ACQUIRE 65536 +#define __GNUG__ 16 +#define __LONG_LONG_MAX__ 0x7fffffffffffffffLL +#define __SIZEOF_SIZE_T__ 8 +#define __BFLT16_HAS_INFINITY__ 1 +#define __FLT64X_MIN_EXP__ (-16381) +#define __SIZEOF_WINT_T__ 4 +#define __FLT32X_DIG__ 15 +#define __LONG_LONG_WIDTH__ 64 +#define __cpp_initializer_lists 200806L +#define __FLT32_MAX_EXP__ 128 +#define __cpp_hex_float 201603L +#define __GXX_ABI_VERSION 1021 +#define __FLT_MIN_EXP__ (-125) +#define __GCC_HAVE_DWARF2_CFI_ASM 1 +#define __x86_64 1 +#define __cpp_lambdas 200907L +#define __INT_FAST64_TYPE__ long int +#define __BFLT16_MAX__ 3.38953138925153547590470800371487867e+38BF16 +#define __FLT64_DENORM_MIN__ 4.94065645841246544176568792868221372e-324F64 +#define __FLT16_DENORM_MIN__ 5.96046447753906250000000000000000000e-8F16 +#define __FLT128_EPSILON__ 1.92592994438723585305597794258492732e-34F128 +#define __FLT64X_NORM_MAX__ 1.18973149535723176502126385303097021e+4932F64x +#define __SIZEOF_POINTER__ 8 +#define __SIZE_TYPE__ long unsigned int +#define __LP64__ 1 +#define __DBL_HAS_QUIET_NAN__ 1 +#define __FLT32X_EPSILON__ 2.22044604925031308084726333618164062e-16F32x +#define __LDBL_MAX_EXP__ 16384 +#define __DECIMAL_BID_FORMAT__ 1 +#define __FLT64_MIN_10_EXP__ (-307) +#define __FLT16_MIN_10_EXP__ (-4) +#define __FLT64X_DECIMAL_DIG__ 21 +#define __DEC128_MIN__ 1E-6143DL +#define __REGISTER_PREFIX__ +#define __UINT16_MAX__ 0xffff +#define __FLT128_HAS_INFINITY__ 1 +#define __FLT32_MIN__ 1.17549435082228750796873653722224568e-38F32 +#define __UINT8_TYPE__ unsigned char +#define __FLT_DIG__ 6 +#define __DEC_EVAL_METHOD__ 2 +#define __FLT_MANT_DIG__ 24 +#define __LDBL_DECIMAL_DIG__ 21 +#define __VERSION__ "16.1.1 20260430" +#define __UINT64_C(c) c ## UL +#define __cpp_unicode_characters 200704L +#define __DEC64X_MIN__ 1E-6143D64x +#define _STDC_PREDEF_H 1 +#define __INT_LEAST32_MAX__ 0x7fffffff +#define __GCC_ATOMIC_INT_LOCK_FREE 2 +#define __FLT128_MAX_EXP__ 16384 +#define __FLT32_MANT_DIG__ 24 +#define __cpp_decltype 200707L +#define __FLOAT_WORD_ORDER__ __ORDER_LITTLE_ENDIAN__ +#define __FLT32X_MIN_EXP__ (-1021) +#define __STDC_IEC_60559_COMPLEX__ 201404L +#define __BFLT16_MIN__ 1.17549435082228750796873653722224568e-38BF16 +#define __FLT128_HAS_DENORM__ 1 +#define __FLT32_DECIMAL_DIG__ 9 +#define __FLT128_DIG__ 33 +#define __INT32_C(c) c +#define __DEC64_EPSILON__ 1E-15DD +#define __ORDER_PDP_ENDIAN__ 3412 +#define __DEC128_MIN_EXP__ (-6142) +#define __DEC128_MAX__ 9.999999999999999999999999999999999E6144DL +#define __INT_FAST32_TYPE__ long int +#define __UINT_LEAST16_TYPE__ short unsigned int +#define __DEC64X_MANT_DIG__ 34 +#define __DEC128_MAX_EXP__ 6145 +#define unix 1 +#define __DBL_HAS_DENORM__ 1 +#define __cpp_rtti 199711L +#define __UINT64_MAX__ 0xffffffffffffffffUL +#define __FLT_IS_IEC_60559__ 1 +#define __GNUC_WIDE_EXECUTION_CHARSET_NAME "UTF-32LE" +#define __FLT64X_DIG__ 18 +#define __INT8_TYPE__ signed char +#define __ELF__ 1 +#define __GCC_ASM_FLAG_OUTPUTS__ 1 +#define __UINT32_TYPE__ unsigned int +#define __BFLT16_HAS_QUIET_NAN__ 1 +#define __FLT_RADIX__ 2 +#define __INT_LEAST16_TYPE__ short int +#define __LDBL_EPSILON__ 1.08420217248550443400745280086994171e-19L +#define __UINTMAX_C(c) c ## UL +#define __FLT16_DIG__ 3 +#define __k8 1 +#define __FLT32X_MIN__ 2.22507385850720138309023271733240406e-308F32x +#define __SIG_ATOMIC_MAX__ 0x7fffffff +#define __cpp_constexpr 200704L +#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2 +#define __USER_LABEL_PREFIX__ +#define __STDC_IEC_60559_BFP__ 201404L +#define __SIZEOF_PTRDIFF_T__ 8 +#define __FLT64X_HAS_INFINITY__ 1 +#define __SIZEOF_LONG__ 8 +#define __LDBL_DIG__ 18 +#define __FLT64_IS_IEC_60559__ 1 +#define __x86_64__ 1 +#define __FLT16_IS_IEC_60559__ 1 +#define __FLT16_MAX_EXP__ 16 +#define __DEC32_SUBNORMAL_MIN__ 0.000001E-95DF +#define __STDC_EMBED_FOUND__ 1 +#define __INT_FAST16_MAX__ 0x7fffffffffffffffL +#define __GCC_CONSTRUCTIVE_SIZE 64 +#define __FLT64_DIG__ 15 +#define __UINT_FAST32_MAX__ 0xffffffffffffffffUL +#define __UINT_LEAST64_TYPE__ long unsigned int +#define __FLT16_EPSILON__ 9.76562500000000000000000000000000000e-4F16 +#define __FLT_HAS_QUIET_NAN__ 1 +#define __FLT_MAX_10_EXP__ 38 +#define __FLT64X_HAS_DENORM__ 1 +#define __DEC128_SUBNORMAL_MIN__ 0.000000000000000000000000000000001E-6143DL +#define __FLT_HAS_INFINITY__ 1 +#define __GNUC_EXECUTION_CHARSET_NAME "UTF-8" +#define __cpp_unicode_literals 200710L +#define __UINT_FAST16_TYPE__ long unsigned int +#define __DEC64_MAX__ 9.999999999999999E384DD +#define __STDC_EMBED_NOT_FOUND__ 0 +#define __INT_FAST32_WIDTH__ 64 +#define __CHAR16_TYPE__ short unsigned int +#define __PRAGMA_REDEFINE_EXTNAME 1 +#define __DEC64X_SUBNORMAL_MIN__ 0.000000000000000000000000000000001E-6143D64x +#define __SIZE_WIDTH__ 64 +#define __SEG_FS 1 +#define __INT_LEAST16_MAX__ 0x7fff +#define __FLT16_NORM_MAX__ 6.55040000000000000000000000000000000e+4F16 +#define __DEC64_MANT_DIG__ 16 +#define __FLT32_DENORM_MIN__ 1.40129846432481707092372958328991613e-45F32 +#define __SIG_ATOMIC_WIDTH__ 32 +#define __INT_LEAST64_TYPE__ long int +#define __INT16_TYPE__ short int +#define __INT_LEAST8_TYPE__ signed char +#define __FLT16_MAX__ 6.55040000000000000000000000000000000e+4F16 +#define __FLT128_MIN__ 3.36210314311209350626267781732175260e-4932F128 +#define __SIZEOF_INT__ 4 +#define __DEC32_MAX_EXP__ 97 +#define __INT_FAST8_MAX__ 0x7f +#define __FLT128_MAX__ 1.18973149535723176508575932662800702e+4932F128 +#define __INTPTR_MAX__ 0x7fffffffffffffffL +#define linux 1 +#define __FLT64_HAS_QUIET_NAN__ 1 +#define __FLT32_MIN_10_EXP__ (-37) +#define __EXCEPTIONS 1 +#define __UINT16_C(c) c +#define __PTRDIFF_WIDTH__ 64 +#define __cpp_range_based_for 200907L +#define __INT_FAST16_WIDTH__ 64 +#define __FLT64_HAS_INFINITY__ 1 +#define __FLT64X_MAX__ 1.18973149535723176502126385303097021e+4932F64x +#define __FLT16_HAS_INFINITY__ 1 +#define __SIG_ATOMIC_MIN__ (-__SIG_ATOMIC_MAX__ - 1) +#define __code_model_small__ 1 +#define __GCC_ATOMIC_LONG_LOCK_FREE 2 +#define __DEC32_MANT_DIG__ 7 +#define __k8__ 1 +#define __INTPTR_TYPE__ long int +#define __UINT16_TYPE__ short unsigned int +#define __WCHAR_TYPE__ int +#define __pic__ 2 +#define __UINTPTR_MAX__ 0xffffffffffffffffUL +#define __INT_FAST64_WIDTH__ 64 +#define __INT_FAST64_MAX__ 0x7fffffffffffffffL +#define __GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1 +#define __FLT_NORM_MAX__ 3.40282346638528859811704183484516925e+38F +#define __FLT32_HAS_INFINITY__ 1 +#define __FLT64X_MAX_EXP__ 16384 +#define __UINT_FAST64_TYPE__ long unsigned int +#define __BFLT16_MIN_EXP__ (-125) +#define __INT_MAX__ 0x7fffffff +#define __linux__ 1 +#define __INT64_TYPE__ long int +#define __FLT_MAX_EXP__ 128 +#define __ORDER_BIG_ENDIAN__ 4321 +#define __DBL_MANT_DIG__ 53 +#define __SIZEOF_FLOAT128__ 16 +#define __BFLT16_MANT_DIG__ 8 +#define __DEC64_MIN__ 1E-383DD +#define __WINT_TYPE__ unsigned int +#define __UINT_LEAST32_TYPE__ unsigned int +#define __SIZEOF_SHORT__ 2 +#define __FLT32_NORM_MAX__ 3.40282346638528859811704183484516925e+38F32 +#define __SSE__ 1 +#define __LDBL_MIN_EXP__ (-16381) +#define __FLT64_MAX__ 1.79769313486231570814527423731704357e+308F64 +#define __DEC64X_MIN_EXP__ (-6142) +#define __amd64__ 1 +#define __WINT_WIDTH__ 32 +#define __INT_LEAST64_WIDTH__ 64 +#define __FLT32X_MAX_10_EXP__ 308 +#define __SIZEOF_INT128__ 16 +#define __FLT16_MIN__ 6.10351562500000000000000000000000000e-5F16 +#define __FLT64X_IS_IEC_60559__ 1 +#define __GXX_CONSTEXPR_ASM__ 1 +#define __LDBL_MAX_10_EXP__ 4932 +#define __ATOMIC_RELAXED 0 +#define __DBL_EPSILON__ double(2.22044604925031308084726333618164062e-16L) +#define __INT_LEAST32_TYPE__ int +#define _LP64 1 +#define __UINT8_C(c) c +#define __FLT64_MAX_EXP__ 1024 +#define __SIZEOF_WCHAR_T__ 4 +#define __GNUC_PATCHLEVEL__ 1 +#define __FLT128_NORM_MAX__ 1.18973149535723176508575932662800702e+4932F128 +#define __FLT64_NORM_MAX__ 1.79769313486231570814527423731704357e+308F64 +#define __FLT128_HAS_QUIET_NAN__ 1 +#define __INTMAX_MAX__ 0x7fffffffffffffffL +#define __INT_FAST8_TYPE__ signed char +#define __FLT64X_MIN__ 3.36210314311209350626267781732175260e-4932F64x +#define __FLT64_EPSILON__ 2.22044604925031308084726333618164062e-16F64 +#define __STDCPP_THREADS__ 1 +#define __BFLT16_HAS_DENORM__ 1 +#define __GNUC_STDC_INLINE__ 1 +#define __FLT64_HAS_DENORM__ 1 +#define __FLT32_EPSILON__ 1.19209289550781250000000000000000000e-7F32 +#define __FLT16_HAS_DENORM__ 1 +#define __DBL_DECIMAL_DIG__ 17 +#define __STDC_UTF_32__ 1 +#define __INT_FAST8_WIDTH__ 8 +#define __FXSR__ 1 +#define __FLT32X_MAX__ 1.79769313486231570814527423731704357e+308F32x +#define __DBL_NORM_MAX__ double(1.79769313486231570814527423731704357e+308L) +#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__ +#define __GCC_DESTRUCTIVE_SIZE 64 +#define __INTMAX_WIDTH__ 64 +#define __cpp_runtime_arrays 198712L +#define __FLT32_DIG__ 6 +#define __UINT64_TYPE__ long unsigned int +#define __UINT32_C(c) c ## U +#define __cpp_alias_templates 200704L +#define __FLT_DENORM_MIN__ 1.40129846432481707092372958328991613e-45F +#define __FLT128_IS_IEC_60559__ 1 +#define __INT8_MAX__ 0x7f +#define __LONG_WIDTH__ 64 +#define __DBL_MIN__ double(2.22507385850720138309023271733240406e-308L) +#define __PIC__ 2 +#define __INT32_MAX__ 0x7fffffff +#define __UINT_FAST32_TYPE__ long unsigned int +#define __FLT16_MANT_DIG__ 11 +#define __FLT32X_NORM_MAX__ 1.79769313486231570814527423731704357e+308F32x +#define __CHAR32_TYPE__ unsigned int +#define __FLT_MAX__ 3.40282346638528859811704183484516925e+38F +#define __SSE2__ 1 +#define __BFLT16_NORM_MAX__ 3.38953138925153547590470800371487867e+38BF16 +#define __INT32_TYPE__ int +#define __SIZEOF_DOUBLE__ 8 +#define __cpp_exceptions 199711L +#define __FLT_MIN_10_EXP__ (-37) +#define __FLT64_MIN__ 2.22507385850720138309023271733240406e-308F64 +#define __INT_LEAST32_WIDTH__ 32 +#define __INTMAX_TYPE__ long int +#define __GLIBCXX_BITSIZE_INT_N_0 128 +#define __FLT32X_HAS_QUIET_NAN__ 1 +#define __ATOMIC_CONSUME 1 +#define __GNUC_MINOR__ 1 +#define __GLIBCXX_TYPE_INT_N_0 __int128 +#define __UINTMAX_MAX__ 0xffffffffffffffffUL +#define __PIE__ 2 +#define __FLT32X_DENORM_MIN__ 4.94065645841246544176568792868221372e-324F32x +#define __DBL_MAX_10_EXP__ 308 +#define __LDBL_DENORM_MIN__ 3.64519953188247460252840593361941982e-4951L +#define __INT16_C(c) c +#define __STDC__ 1 +#define __PTRDIFF_TYPE__ long int +#define __LONG_MAX__ 0x7fffffffffffffffL +#define __FLT32X_MIN_10_EXP__ (-307) +#define __UINTPTR_TYPE__ long unsigned int +#define __DEC64_SUBNORMAL_MIN__ 0.000000000000001E-383DD +#define __DEC128_MANT_DIG__ 34 +#define __LDBL_MIN_10_EXP__ (-4931) +#define __SSE_MATH__ 1 +#define __SIZEOF_LONG_LONG__ 8 +#define __cpp_user_defined_literals 200809L +#define __FLT128_DECIMAL_DIG__ 36 +#define __GCC_ATOMIC_LLONG_LOCK_FREE 2 +#define __FLT32_HAS_QUIET_NAN__ 1 +#define __FLT_DECIMAL_DIG__ 9 +#define __UINT_FAST16_MAX__ 0xffffffffffffffffUL +#define __LDBL_NORM_MAX__ 1.18973149535723176502126385303097021e+4932L +#define __GCC_ATOMIC_SHORT_LOCK_FREE 2 +#define __SIZE_MAX__ 0xffffffffffffffffUL +#define __UINT_FAST8_TYPE__ unsigned char +#define _GNU_SOURCE 1 +#define __ATOMIC_ACQ_REL 4 +#define __ATOMIC_RELEASE 3 diff --git a/src/gui/QT/build_output/ui_hiperiso2diskwindow.h b/src/gui/QT/build_output/ui_hiperiso2diskwindow.h new file mode 100644 index 0000000..a1e493b --- /dev/null +++ b/src/gui/QT/build_output/ui_hiperiso2diskwindow.h @@ -0,0 +1,212 @@ +/******************************************************************************** +** Form generated from reading UI file 'hiperiso2diskwindow.ui' +** +** Created by: Qt User Interface Compiler version 5.15.19 +** +** WARNING! All changes made in this file will be lost when recompiling UI file! +********************************************************************************/ + +#ifndef UI_HIPERISO2DISKWINDOW_H +#define UI_HIPERISO2DISKWINDOW_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class Ui_Hiperiso2DiskWindow +{ +public: + QAction *actionSecure_Boot_Support; + QAction *actionMBR; + QAction *actionGPT; + QAction *actionPartition_Configuration; + QAction *actionClear_Hiperiso; + QAction *actionShow_All_Devices; + QAction *actionAbout; + QWidget *centralwidget; + QGroupBox *groupBoxDevice; + QComboBox *comboBoxDevice; + QPushButton *ButtonRefresh; + QGroupBox *groupBoxHiperisoLocal; + QLabel *labelHiperisoLocalVer; + QLabel *labelHiperisoLocalPartStyle; + QLabel *labelHiperisoLocalSecure; + QGroupBox *groupBoxHiperisoDevice; + QLabel *labelHiperisoDeviceVer; + QLabel *labelHiperisoDevicePartStyle; + QLabel *labelHiperisoDeviceSecure; + QGroupBox *groupBoxStatus; + QProgressBar *progressBar; + QPushButton *ButtonInstall; + QPushButton *ButtonUpdate; + QMenuBar *menubar; + QMenu *menuOption; + QMenu *menuPartition_Style; + QMenu *menuLanguage; + QMenu *menuHelp; + + void setupUi(QMainWindow *Hiperiso2DiskWindow) + { + if (Hiperiso2DiskWindow->objectName().isEmpty()) + Hiperiso2DiskWindow->setObjectName(QString::fromUtf8("Hiperiso2DiskWindow")); + Hiperiso2DiskWindow->resize(696, 418); + Hiperiso2DiskWindow->setMinimumSize(QSize(696, 418)); + actionSecure_Boot_Support = new QAction(Hiperiso2DiskWindow); + actionSecure_Boot_Support->setObjectName(QString::fromUtf8("actionSecure_Boot_Support")); + actionSecure_Boot_Support->setCheckable(true); + actionMBR = new QAction(Hiperiso2DiskWindow); + actionMBR->setObjectName(QString::fromUtf8("actionMBR")); + actionMBR->setCheckable(true); + actionGPT = new QAction(Hiperiso2DiskWindow); + actionGPT->setObjectName(QString::fromUtf8("actionGPT")); + actionGPT->setCheckable(true); + actionPartition_Configuration = new QAction(Hiperiso2DiskWindow); + actionPartition_Configuration->setObjectName(QString::fromUtf8("actionPartition_Configuration")); + actionClear_Hiperiso = new QAction(Hiperiso2DiskWindow); + actionClear_Hiperiso->setObjectName(QString::fromUtf8("actionClear_Hiperiso")); + actionShow_All_Devices = new QAction(Hiperiso2DiskWindow); + actionShow_All_Devices->setObjectName(QString::fromUtf8("actionShow_All_Devices")); + actionShow_All_Devices->setCheckable(true); + actionAbout = new QAction(Hiperiso2DiskWindow); + actionAbout->setObjectName(QString::fromUtf8("actionAbout")); + centralwidget = new QWidget(Hiperiso2DiskWindow); + centralwidget->setObjectName(QString::fromUtf8("centralwidget")); + groupBoxDevice = new QGroupBox(centralwidget); + groupBoxDevice->setObjectName(QString::fromUtf8("groupBoxDevice")); + groupBoxDevice->setGeometry(QRect(12, 11, 672, 88)); + comboBoxDevice = new QComboBox(groupBoxDevice); + comboBoxDevice->setObjectName(QString::fromUtf8("comboBoxDevice")); + comboBoxDevice->setGeometry(QRect(12, 44, 600, 29)); + ButtonRefresh = new QPushButton(groupBoxDevice); + ButtonRefresh->setObjectName(QString::fromUtf8("ButtonRefresh")); + ButtonRefresh->setGeometry(QRect(624, 41, 36, 33)); + QIcon icon; + icon.addFile(QString::fromUtf8("../refresh.ico"), QSize(), QIcon::Normal, QIcon::Off); + ButtonRefresh->setIcon(icon); + ButtonRefresh->setIconSize(QSize(24, 24)); + groupBoxHiperisoLocal = new QGroupBox(centralwidget); + groupBoxHiperisoLocal->setObjectName(QString::fromUtf8("groupBoxHiperisoLocal")); + groupBoxHiperisoLocal->setGeometry(QRect(12, 110, 330, 88)); + groupBoxHiperisoLocal->setAlignment(Qt::AlignCenter); + labelHiperisoLocalVer = new QLabel(groupBoxHiperisoLocal); + labelHiperisoLocalVer->setObjectName(QString::fromUtf8("labelHiperisoLocalVer")); + labelHiperisoLocalVer->setGeometry(QRect(36, 33, 240, 45)); + labelHiperisoLocalVer->setAlignment(Qt::AlignCenter); + labelHiperisoLocalPartStyle = new QLabel(groupBoxHiperisoLocal); + labelHiperisoLocalPartStyle->setObjectName(QString::fromUtf8("labelHiperisoLocalPartStyle")); + labelHiperisoLocalPartStyle->setGeometry(QRect(286, 66, 37, 20)); + labelHiperisoLocalSecure = new QLabel(groupBoxHiperisoLocal); + labelHiperisoLocalSecure->setObjectName(QString::fromUtf8("labelHiperisoLocalSecure")); + labelHiperisoLocalSecure->setGeometry(QRect(14, 40, 25, 34)); + labelHiperisoLocalSecure->setPixmap(QPixmap(QString::fromUtf8("../secure.ico"))); + groupBoxHiperisoDevice = new QGroupBox(centralwidget); + groupBoxHiperisoDevice->setObjectName(QString::fromUtf8("groupBoxHiperisoDevice")); + groupBoxHiperisoDevice->setGeometry(QRect(354, 110, 330, 88)); + groupBoxHiperisoDevice->setAlignment(Qt::AlignCenter); + labelHiperisoDeviceVer = new QLabel(groupBoxHiperisoDevice); + labelHiperisoDeviceVer->setObjectName(QString::fromUtf8("labelHiperisoDeviceVer")); + labelHiperisoDeviceVer->setGeometry(QRect(36, 33, 240, 45)); + labelHiperisoDeviceVer->setAlignment(Qt::AlignCenter); + labelHiperisoDevicePartStyle = new QLabel(groupBoxHiperisoDevice); + labelHiperisoDevicePartStyle->setObjectName(QString::fromUtf8("labelHiperisoDevicePartStyle")); + labelHiperisoDevicePartStyle->setGeometry(QRect(286, 66, 37, 20)); + labelHiperisoDeviceSecure = new QLabel(groupBoxHiperisoDevice); + labelHiperisoDeviceSecure->setObjectName(QString::fromUtf8("labelHiperisoDeviceSecure")); + labelHiperisoDeviceSecure->setGeometry(QRect(14, 40, 25, 34)); + labelHiperisoDeviceSecure->setPixmap(QPixmap(QString::fromUtf8("../secure.ico"))); + groupBoxStatus = new QGroupBox(centralwidget); + groupBoxStatus->setObjectName(QString::fromUtf8("groupBoxStatus")); + groupBoxStatus->setGeometry(QRect(12, 209, 672, 67)); + progressBar = new QProgressBar(groupBoxStatus); + progressBar->setObjectName(QString::fromUtf8("progressBar")); + progressBar->setGeometry(QRect(12, 33, 648, 25)); + progressBar->setValue(0); + progressBar->setTextVisible(true); + ButtonInstall = new QPushButton(centralwidget); + ButtonInstall->setObjectName(QString::fromUtf8("ButtonInstall")); + ButtonInstall->setGeometry(QRect(180, 302, 121, 45)); + ButtonUpdate = new QPushButton(centralwidget); + ButtonUpdate->setObjectName(QString::fromUtf8("ButtonUpdate")); + ButtonUpdate->setGeometry(QRect(396, 302, 121, 45)); + Hiperiso2DiskWindow->setCentralWidget(centralwidget); + menubar = new QMenuBar(Hiperiso2DiskWindow); + menubar->setObjectName(QString::fromUtf8("menubar")); + menubar->setGeometry(QRect(0, 0, 696, 25)); + menuOption = new QMenu(menubar); + menuOption->setObjectName(QString::fromUtf8("menuOption")); + menuPartition_Style = new QMenu(menuOption); + menuPartition_Style->setObjectName(QString::fromUtf8("menuPartition_Style")); + menuLanguage = new QMenu(menubar); + menuLanguage->setObjectName(QString::fromUtf8("menuLanguage")); + menuHelp = new QMenu(menubar); + menuHelp->setObjectName(QString::fromUtf8("menuHelp")); + Hiperiso2DiskWindow->setMenuBar(menubar); + + menubar->addAction(menuOption->menuAction()); + menubar->addAction(menuLanguage->menuAction()); + menubar->addAction(menuHelp->menuAction()); + menuOption->addAction(actionSecure_Boot_Support); + menuOption->addAction(menuPartition_Style->menuAction()); + menuOption->addAction(actionPartition_Configuration); + menuOption->addAction(actionClear_Hiperiso); + menuOption->addAction(actionShow_All_Devices); + menuPartition_Style->addAction(actionMBR); + menuPartition_Style->addAction(actionGPT); + menuHelp->addAction(actionAbout); + + retranslateUi(Hiperiso2DiskWindow); + + QMetaObject::connectSlotsByName(Hiperiso2DiskWindow); + } // setupUi + + void retranslateUi(QMainWindow *Hiperiso2DiskWindow) + { + Hiperiso2DiskWindow->setWindowTitle(QCoreApplication::translate("Hiperiso2DiskWindow", "Hiperiso2Disk", nullptr)); + actionSecure_Boot_Support->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "Secure Boot Support", nullptr)); + actionMBR->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "MBR", nullptr)); + actionGPT->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "GPT", nullptr)); + actionPartition_Configuration->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "Partition Configuration", nullptr)); + actionClear_Hiperiso->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "Clear Hiperiso", nullptr)); + actionShow_All_Devices->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "Show All Devices", nullptr)); + actionAbout->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "About", nullptr)); + groupBoxDevice->setTitle(QCoreApplication::translate("Hiperiso2DiskWindow", "Device", nullptr)); + ButtonRefresh->setText(QString()); + groupBoxHiperisoLocal->setTitle(QCoreApplication::translate("Hiperiso2DiskWindow", "Hiperiso In Package", nullptr)); + labelHiperisoLocalVer->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "

1.0.53

", nullptr)); + labelHiperisoLocalPartStyle->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "

MBR

", nullptr)); + labelHiperisoLocalSecure->setText(QString()); + groupBoxHiperisoDevice->setTitle(QCoreApplication::translate("Hiperiso2DiskWindow", "Hiperiso In Device", nullptr)); + labelHiperisoDeviceVer->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "

1.0.52

", nullptr)); + labelHiperisoDevicePartStyle->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "

GPT

", nullptr)); + labelHiperisoDeviceSecure->setText(QString()); + groupBoxStatus->setTitle(QCoreApplication::translate("Hiperiso2DiskWindow", "Status: READY", nullptr)); + progressBar->setFormat(QCoreApplication::translate("Hiperiso2DiskWindow", "%p%", nullptr)); + ButtonInstall->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "Install", nullptr)); + ButtonUpdate->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "Update", nullptr)); + menuOption->setTitle(QCoreApplication::translate("Hiperiso2DiskWindow", "Option", nullptr)); + menuPartition_Style->setTitle(QCoreApplication::translate("Hiperiso2DiskWindow", "Partition Style", nullptr)); + menuLanguage->setTitle(QCoreApplication::translate("Hiperiso2DiskWindow", "Language", nullptr)); + menuHelp->setTitle(QCoreApplication::translate("Hiperiso2DiskWindow", "Help", nullptr)); + } // retranslateUi + +}; + +namespace Ui { + class Hiperiso2DiskWindow: public Ui_Hiperiso2DiskWindow {}; +} // namespace Ui + +QT_END_NAMESPACE + +#endif // UI_HIPERISO2DISKWINDOW_H diff --git a/src/gui/QT/build_output/ui_partcfgdialog.h b/src/gui/QT/build_output/ui_partcfgdialog.h new file mode 100644 index 0000000..a328b5d --- /dev/null +++ b/src/gui/QT/build_output/ui_partcfgdialog.h @@ -0,0 +1,146 @@ +/******************************************************************************** +** Form generated from reading UI file 'partcfgdialog.ui' +** +** Created by: Qt User Interface Compiler version 5.15.19 +** +** WARNING! All changes made in this file will be lost when recompiling UI file! +********************************************************************************/ + +#ifndef UI_PARTCFGDIALOG_H +#define UI_PARTCFGDIALOG_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class Ui_PartCfgDialog +{ +public: + QPushButton *pushButtonOK; + QPushButton *pushButtonCancel; + QGroupBox *groupBox; + QCheckBox *checkBox; + QGroupBox *groupBox_2; + QLineEdit *lineEdit; + QGroupBox *groupBox_3; + QComboBox *comboBox; + QGroupBox *groupBox_4; + QCheckBox *checkBox_2; + QGroupBox *groupBox_5; + QLabel *labelFsType; + QComboBox *comboBoxFsType; + QGroupBox *groupBox_6; + QLabel *labelClusterSize; + QLineEdit *lineEditClusterSize; + + void setupUi(QDialog *PartCfgDialog) + { + if (PartCfgDialog->objectName().isEmpty()) + PartCfgDialog->setObjectName(QString::fromUtf8("PartCfgDialog")); + PartCfgDialog->resize(420, 358); + pushButtonOK = new QPushButton(PartCfgDialog); + pushButtonOK->setObjectName(QString::fromUtf8("pushButtonOK")); + pushButtonOK->setGeometry(QRect(90, 310, 90, 30)); + pushButtonCancel = new QPushButton(PartCfgDialog); + pushButtonCancel->setObjectName(QString::fromUtf8("pushButtonCancel")); + pushButtonCancel->setGeometry(QRect(230, 310, 90, 30)); + groupBox = new QGroupBox(PartCfgDialog); + groupBox->setObjectName(QString::fromUtf8("groupBox")); + groupBox->setGeometry(QRect(10, 10, 400, 51)); + checkBox = new QCheckBox(groupBox); + checkBox->setObjectName(QString::fromUtf8("checkBox")); + checkBox->setGeometry(QRect(10, 10, 381, 41)); + checkBox->setAutoRepeatInterval(0); + groupBox_2 = new QGroupBox(PartCfgDialog); + groupBox_2->setObjectName(QString::fromUtf8("groupBox_2")); + groupBox_2->setGeometry(QRect(10, 60, 200, 60)); + lineEdit = new QLineEdit(groupBox_2); + lineEdit->setObjectName(QString::fromUtf8("lineEdit")); + lineEdit->setGeometry(QRect(10, 20, 181, 26)); + lineEdit->setMaxLength(14); + groupBox_3 = new QGroupBox(PartCfgDialog); + groupBox_3->setObjectName(QString::fromUtf8("groupBox_3")); + groupBox_3->setGeometry(QRect(210, 60, 200, 60)); + comboBox = new QComboBox(groupBox_3); + comboBox->addItem(QString()); + comboBox->addItem(QString()); + comboBox->setObjectName(QString::fromUtf8("comboBox")); + comboBox->setGeometry(QRect(10, 20, 181, 26)); + groupBox_4 = new QGroupBox(PartCfgDialog); + groupBox_4->setObjectName(QString::fromUtf8("groupBox_4")); + groupBox_4->setGeometry(QRect(10, 130, 401, 51)); + checkBox_2 = new QCheckBox(groupBox_4); + checkBox_2->setObjectName(QString::fromUtf8("checkBox_2")); + checkBox_2->setGeometry(QRect(10, 18, 381, 24)); + checkBox_2->setChecked(true); + groupBox_5 = new QGroupBox(PartCfgDialog); + groupBox_5->setObjectName(QString::fromUtf8("groupBox_5")); + groupBox_5->setGeometry(QRect(10, 190, 401, 51)); + labelFsType = new QLabel(groupBox_5); + labelFsType->setObjectName(QString::fromUtf8("labelFsType")); + labelFsType->setGeometry(QRect(10, 15, 120, 21)); + comboBoxFsType = new QComboBox(groupBox_5); + comboBoxFsType->addItem(QString()); + comboBoxFsType->addItem(QString()); + comboBoxFsType->setObjectName(QString::fromUtf8("comboBoxFsType")); + comboBoxFsType->setGeometry(QRect(140, 12, 241, 26)); + groupBox_6 = new QGroupBox(PartCfgDialog); + groupBox_6->setObjectName(QString::fromUtf8("groupBox_6")); + groupBox_6->setGeometry(QRect(10, 250, 401, 51)); + labelClusterSize = new QLabel(groupBox_6); + labelClusterSize->setObjectName(QString::fromUtf8("labelClusterSize")); + labelClusterSize->setGeometry(QRect(10, 15, 200, 21)); + lineEditClusterSize = new QLineEdit(groupBox_6); + lineEditClusterSize->setObjectName(QString::fromUtf8("lineEditClusterSize")); + lineEditClusterSize->setGeometry(QRect(220, 12, 161, 26)); + lineEditClusterSize->setMaxLength(10); + + retranslateUi(PartCfgDialog); + + comboBox->setCurrentIndex(1); + comboBoxFsType->setCurrentIndex(0); + + + QMetaObject::connectSlotsByName(PartCfgDialog); + } // setupUi + + void retranslateUi(QDialog *PartCfgDialog) + { + PartCfgDialog->setWindowTitle(QCoreApplication::translate("PartCfgDialog", "Partition Configuration", nullptr)); + pushButtonOK->setText(QCoreApplication::translate("PartCfgDialog", "OK", nullptr)); + pushButtonCancel->setText(QCoreApplication::translate("PartCfgDialog", "Cancel", nullptr)); + groupBox->setTitle(QString()); + checkBox->setText(QCoreApplication::translate("PartCfgDialog", "Preserve some space at the end of the disk", nullptr)); + groupBox_2->setTitle(QString()); + groupBox_3->setTitle(QString()); + comboBox->setItemText(0, QCoreApplication::translate("PartCfgDialog", "MB", nullptr)); + comboBox->setItemText(1, QCoreApplication::translate("PartCfgDialog", "GB", nullptr)); + + groupBox_4->setTitle(QString()); + checkBox_2->setText(QCoreApplication::translate("PartCfgDialog", "Align partitions with 4KB", nullptr)); + groupBox_5->setTitle(QString()); + labelFsType->setText(QCoreApplication::translate("PartCfgDialog", "Filesystem:", nullptr)); + comboBoxFsType->setItemText(0, QCoreApplication::translate("PartCfgDialog", "exFAT", nullptr)); + comboBoxFsType->setItemText(1, QCoreApplication::translate("PartCfgDialog", "NTFS", nullptr)); + + groupBox_6->setTitle(QString()); + labelClusterSize->setText(QCoreApplication::translate("PartCfgDialog", "Cluster Size (sectors):", nullptr)); + } // retranslateUi + +}; + +namespace Ui { + class PartCfgDialog: public Ui_PartCfgDialog {}; +} // namespace Ui + +QT_END_NAMESPACE + +#endif // UI_PARTCFGDIALOG_H diff --git a/src/gui/QT/hiperiso.qss b/src/gui/QT/hiperiso.qss new file mode 100644 index 0000000..c1083cb --- /dev/null +++ b/src/gui/QT/hiperiso.qss @@ -0,0 +1,348 @@ +/* ============================================================ + * hiperiso.qss — Hiperiso2Disk Qt5 stylesheet + * + * NOTE: This file is the canonical reference copy. The exact same + * content is embedded as a raw-string literal in main.cpp so the + * binary is self-contained and needs no external file at runtime. + * Keep the two copies in sync when editing. + * + * Brand accent: #2d8e57 (green) + * ============================================================ */ + +/* ---- Base foreground (font inherited from system) ---- */ +QWidget { + color: #1f2933; +} + +QMainWindow { + background-color: #eef1f5; +} + +/* ---- Group boxes (panels) ---- */ +QGroupBox { + background-color: #ffffff; + border: 1px solid #d4d7dd; + border-radius: 6px; + margin-top: 14px; + padding: 14px 10px 10px 10px; + font-weight: bold; + color: #2d8e57; +} + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top left; + left: 12px; + padding: 0 6px; + background-color: #ffffff; + color: #2d8e57; + font-weight: bold; +} + +/* ---- Combo boxes ---- */ +QComboBox { + background-color: #ffffff; + border: 1px solid #c4c9d2; + border-radius: 4px; + padding: 4px 28px 4px 10px; + min-height: 22px; + color: #1f2933; + selection-background-color: #2d8e57; + selection-color: #ffffff; +} + +QComboBox:hover { + border: 1px solid #2d8e57; +} + +QComboBox::drop-down { + subcontrol-origin: padding; + subcontrol-position: top right; + width: 24px; + border-left: 1px solid #d4d7dd; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + background-color: #f5f6f8; +} + +QComboBox::drop-down:hover { + background-color: #e6efe9; +} + +QComboBox QAbstractItemView { + border: 1px solid #c4c9d2; + border-radius: 4px; + background-color: #ffffff; + selection-background-color: #2d8e57; + selection-color: #ffffff; + outline: none; + padding: 4px; +} + +/* ---- Progress bar ---- */ +QProgressBar { + background-color: #e6e9ee; + border: 1px solid #c4c9d2; + border-radius: 4px; + text-align: center; + color: #ffffff; + font-weight: bold; + min-height: 22px; +} + +QProgressBar::chunk { + background-color: #2d8e57; + border-radius: 3px; +} + +/* ---- Labels ---- */ +QLabel { + color: #1f2933; +} + +QGroupBox QLabel { + background: transparent; +} + +/* ---- Default buttons ---- */ +QPushButton { + background-color: #ffffff; + border: 1px solid #c4c9d2; + border-radius: 4px; + padding: 6px 16px; + color: #1f2933; + min-height: 20px; +} + +QPushButton:hover { + background-color: #f0f3f6; + border: 1px solid #2d8e57; + color: #2d8e57; +} + +QPushButton:pressed { + background-color: #e3e8ed; +} + +QPushButton:disabled { + color: #a0a6b0; + background-color: #f2f4f7; + border: 1px solid #dde0e6; +} + +/* ---- Primary brand buttons (Install / Update) ---- */ +QPushButton#ButtonInstall, +QPushButton#ButtonUpdate { + background-color: #2d8e57; + border: 1px solid #256e44; + color: #ffffff; + font-weight: 600; +} + +QPushButton#ButtonInstall:hover, +QPushButton#ButtonUpdate:hover { + background-color: #329f66; + border: 1px solid #256e44; + color: #ffffff; +} + +QPushButton#ButtonInstall:pressed, +QPushButton#ButtonUpdate:pressed { + background-color: #256e44; + color: #ffffff; +} + +QPushButton#ButtonInstall:disabled, +QPushButton#ButtonUpdate:disabled { + background-color: #a9cdb8; + border: 1px solid #94bda3; + color: #f2f7f4; +} + +/* ---- Refresh (icon) button ---- */ +QPushButton#ButtonRefresh { + background-color: #ffffff; + border: 1px solid #c4c9d2; + border-radius: 4px; +} + +QPushButton#ButtonRefresh:hover { + background-color: #e6efe9; + border: 1px solid #2d8e57; +} + +QPushButton#ButtonRefresh:pressed { + background-color: #d2e4d9; +} + +/* ---- Menu bar & menus ---- */ +QMenuBar { + background-color: #ffffff; + color: #1f2933; + border-bottom: 1px solid #d4d7dd; + padding: 2px; +} + +QMenuBar::item { + background-color: transparent; + padding: 6px 12px; + border-radius: 3px; +} + +QMenuBar::item:selected { + background-color: #e6efe9; + color: #2d8e57; +} + +QMenu { + background-color: #ffffff; + border: 1px solid #d4d7dd; + border-radius: 4px; + padding: 4px; +} + +QMenu::item { + padding: 6px 24px; + border-radius: 3px; +} + +QMenu::item:selected { + background-color: #2d8e57; + color: #ffffff; +} + +QMenu::separator { + height: 1px; + background: #e3e6eb; + margin: 4px 8px; +} + +/* ---- Scroll bars ---- */ +QScrollBar:vertical { + background: #eef1f5; + width: 10px; + border: none; +} + +QScrollBar::handle:vertical { + background: #c4c9d2; + border-radius: 4px; + min-height: 24px; +} + +QScrollBar::handle:vertical:hover { + background: #2d8e57; +} + +QScrollBar::add-line:vertical, +QScrollBar::sub-line:vertical { + height: 0px; +} + +QScrollBar::add-page:vertical, +QScrollBar::sub-page:vertical { + background: none; +} + +/* ---- Tooltips ---- */ +QToolTip { + background-color: #1f2933; + color: #ffffff; + border: 1px solid #1f2933; + border-radius: 3px; + padding: 4px 8px; +} + +/* ---- Dialog (PartCfg etc.) ---- */ +QDialog { + background-color: #f5f6f8; +} + +QGroupBox { + background-color: #ffffff; + border: 1px solid #d4d7dd; + border-radius: 6px; + margin-top: 14px; + padding: 14px 10px 10px 10px; + font-weight: bold; + color: #2d8e57; +} + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top left; + left: 12px; + padding: 0 6px; + background-color: #ffffff; + color: #2d8e57; +} + +/* ---- Radio buttons & checkboxes ---- */ +QRadioButton { + spacing: 6px; + color: #1f2933; +} +QRadioButton::indicator { + width: 16px; + height: 16px; + border-radius: 8px; + border: 2px solid #c4c9d2; + background: #ffffff; +} +QRadioButton::indicator:hover { + border: 2px solid #2d8e57; +} +QRadioButton::indicator:checked { + border: 2px solid #2d8e57; + background: qradialgradient(cx:0.5, cy:0.5, radius:0.5, + fx:0.5, fy:0.5, + stop:0 #2d8e57, stop:0.5 #2d8e57, + stop:0.6 transparent, stop:1 transparent); +} + +QCheckBox { + spacing: 6px; + color: #1f2933; +} +QCheckBox::indicator { + width: 16px; + height: 16px; + border-radius: 3px; + border: 2px solid #c4c9d2; + background: #ffffff; +} +QCheckBox::indicator:hover { + border: 2px solid #2d8e57; +} +QCheckBox::indicator:checked { + border: 2px solid #2d8e57; + background: #2d8e57; + image: none; +} + +/* ---- Line edits & spin boxes ---- */ +QLineEdit, QSpinBox { + background-color: #ffffff; + border: 1px solid #c4c9d2; + border-radius: 4px; + padding: 4px 8px; + color: #1f2933; + selection-background-color: #2d8e57; + selection-color: #ffffff; +} +QLineEdit:focus, QSpinBox:focus { + border: 1px solid #2d8e57; +} +QSpinBox::up-button, QSpinBox::down-button { + background: #eef1f5; + border: none; + width: 18px; +} +QSpinBox::up-button:hover, QSpinBox::down-button:hover { + background: #d2e4d9; +} + +/* ---- Dialog buttons ---- */ +QDialogButtonBox QPushButton { + min-width: 72px; +} diff --git a/src/gui/QT/hiperiso2diskwindow.cpp b/src/gui/QT/hiperiso2diskwindow.cpp new file mode 100644 index 0000000..7cfcccb --- /dev/null +++ b/src/gui/QT/hiperiso2diskwindow.cpp @@ -0,0 +1,1131 @@ +#include "hiperiso2diskwindow.h" +#include "ui_hiperiso2diskwindow.h" +#include "partcfgdialog.h" + +#include +#include +#include +#include + +extern "C" { +#include "hiperiso_define.h" +#include "hiperiso_util.h" +#include "hiperiso_disk.h" +#include "hiperiso_json.h" +#include "hiperiso_http.h" +#include "hiperiso_qt.h" +} + +MyQThread::MyQThread(QObject *parent) : QThread(parent) +{ + m_index = -1; + m_type = 0; + m_running = false; + m_fs_type = 0; + m_cluster_size = 0; +} + +void MyQThread::install_run() +{ + int ret = 0; + int pos = 0; + int buflen = 0; + int percent = 0; + char buf[1024]; + char dec[64]; + char out[256]; + char disk_name[32]; + hiperiso_disk *cur; + + vlog("install run %d ...\n", m_index); + + cur = g_disk_list + m_index; + snprintf(disk_name, sizeof(disk_name), "%s", cur->disk_name); + snprintf(dec, sizeof(dec), "%llu", (unsigned long long)m_reserve_space); + + buflen = sizeof(buf); + HISO_JSON_FMT_BEGIN(pos, buf, buflen); + HISO_JSON_FMT_OBJ_BEGIN(); + HISO_JSON_FMT_STRN("method", "install"); + HISO_JSON_FMT_STRN("disk", disk_name); + HISO_JSON_FMT_STRN("reserve_space", dec); + HISO_JSON_FMT_UINT("partstyle", hiperiso_code_get_cur_part_style()); + HISO_JSON_FMT_UINT("secure_boot", m_secureboot); + HISO_JSON_FMT_UINT("align_4kb", m_align4K); + HISO_JSON_FMT_UINT("fs_type", m_fs_type); + HISO_JSON_FMT_UINT("cluster_sectors", m_cluster_size); + HISO_JSON_FMT_OBJ_END(); + HISO_JSON_FMT_END(pos); + + out[0] = 0; + hiperiso_func_handler(buf, out, sizeof(out)); + vlog("func handler install <%s>\n", out); + + if (strstr(out, "success")) + { + while (percent != 100) + { + percent = hiperiso_code_get_percent(); + emit thread_event(THREAD_MSG_PROGRESS_BAR, percent); + msleep(50); + } + + ret = hiperiso_code_get_result(); + hiperiso_code_refresh_device(); + cur = NULL; + } + else + { + ret = 1; + } + + emit thread_event(THREAD_MSG_INSTALL_FINISH, ret); + m_running = false; +} + +void MyQThread::update_run() +{ + int ret = 0; + int percent = 0; + char buf[1024]; + char out[256]; + char disk_name[32]; + hiperiso_disk *cur; + + vlog("install run %d ...\n", m_index); + + cur = g_disk_list + m_index; + snprintf(disk_name, sizeof(disk_name), "%s", cur->disk_name); + snprintf(buf, sizeof(buf), "{\"method\":\"update\",\"disk\":\"%s\",\"secure_boot\":%d}", disk_name, m_secureboot); + + out[0] = 0; + hiperiso_func_handler(buf, out, sizeof(out)); + vlog("func handler update <%s>\n", out); + + if (strstr(out, "success")) + { + while (percent != 100) + { + percent = hiperiso_code_get_percent(); + emit thread_event(THREAD_MSG_PROGRESS_BAR, percent); + msleep(50); + } + + ret = hiperiso_code_get_result(); + hiperiso_code_refresh_device(); + cur = NULL; + } + else + { + ret = 1; + } + + emit thread_event(THREAD_MSG_UPDATE_FINISH, ret); + m_running = false; +} + +void MyQThread::install_nondestr_run() +{ + int ret = 0; + char cmd[512]; + char buf[256]; + char disk_name[32]; + hiperiso_disk *cur; + + vlog("non-destructive install run %d ...\n", m_index); + + cur = g_disk_list + m_index; + snprintf(disk_name, sizeof(disk_name), "%s", cur->disk_name); + snprintf(cmd, sizeof(cmd), "echo y | sh ./tool/HiperisoWorker.sh -i -n %s 2>&1", disk_name); + + FILE *fp = popen(cmd, "r"); + if (!fp) + { + emit thread_event(THREAD_MSG_INSTALL_NONDESTR_FINISH, 1); + m_running = false; + return; + } + + while (fgets(buf, sizeof(buf), fp)) + { + vlog("%s", buf); + } + + ret = pclose(fp); + ret = WEXITSTATUS(ret); + + hiperiso_code_refresh_device(); + emit thread_event(THREAD_MSG_INSTALL_NONDESTR_FINISH, ret); + m_running = false; +} + +void MyQThread::run() +{ + if (THREAD_TYPE_INSTALL == m_type) + { + install_run(); + } + else if (THREAD_TYPE_UPDATE == m_type) + { + update_run(); + } + else if (THREAD_TYPE_INSTALL_NONDESTR == m_type) + { + install_nondestr_run(); + } + else + { + + } +} + + +Hiperiso2DiskWindow::Hiperiso2DiskWindow(QWidget *parent) + : QMainWindow(parent) + , ui(new Ui::Hiperiso2DiskWindow) +{ + m_partcfg = new PartCfgDialog(); + m_part_group = new QActionGroup(this); + m_lang_group = new QActionGroup(this); + m_thread = new MyQThread(this); + + ui->setupUi(this); + setup_runtime_layout(); + + QAction *actNonDestr = new QAction("Install (Non-Destructive)", this); + actNonDestr->setObjectName("actionInstall_Non_Destructive"); + ui->menuOption->addAction(actNonDestr); + connect(actNonDestr, &QAction::triggered, this, &Hiperiso2DiskWindow::on_actionInstall_Non_Destructive_triggered); +} + +Hiperiso2DiskWindow::~Hiperiso2DiskWindow() +{ + delete m_partcfg; + delete m_part_group; + delete m_lang_group; + delete m_thread; + delete ui; +} + +void Hiperiso2DiskWindow::setup_runtime_layout() +{ + auto *mainLayout = new QVBoxLayout(ui->centralwidget); + mainLayout->setContentsMargins(10, 10, 10, 10); + mainLayout->setSpacing(10); + + auto *deviceLayout = new QHBoxLayout(); + deviceLayout->setContentsMargins(10, 28, 10, 10); + deviceLayout->setSpacing(10); + deviceLayout->addWidget(ui->comboBoxDevice, 1); + deviceLayout->addWidget(ui->ButtonRefresh, 0, Qt::AlignVCenter); + ui->groupBoxDevice->setLayout(deviceLayout); + + auto *localLayout = new QGridLayout(); + localLayout->setContentsMargins(12, 22, 12, 8); + localLayout->setHorizontalSpacing(8); + localLayout->setVerticalSpacing(4); + localLayout->addWidget(ui->labelHiperisoLocalSecure, 0, 0, 2, 1, Qt::AlignLeft | Qt::AlignVCenter); + localLayout->addWidget(ui->labelHiperisoLocalVer, 0, 1, 2, 1, Qt::AlignCenter); + localLayout->addWidget(ui->labelHiperisoLocalPartStyle, 1, 2, 1, 1, Qt::AlignRight | Qt::AlignBottom); + localLayout->setColumnStretch(1, 1); + ui->groupBoxHiperisoLocal->setLayout(localLayout); + + auto *deviceInfoLayout = new QGridLayout(); + deviceInfoLayout->setContentsMargins(12, 22, 12, 8); + deviceInfoLayout->setHorizontalSpacing(8); + deviceInfoLayout->setVerticalSpacing(4); + deviceInfoLayout->addWidget(ui->labelHiperisoDeviceSecure, 0, 0, 2, 1, Qt::AlignLeft | Qt::AlignVCenter); + deviceInfoLayout->addWidget(ui->labelHiperisoDeviceVer, 0, 1, 2, 1, Qt::AlignCenter); + deviceInfoLayout->addWidget(ui->labelHiperisoDevicePartStyle, 1, 2, 1, 1, Qt::AlignRight | Qt::AlignBottom); + deviceInfoLayout->setColumnStretch(1, 1); + ui->groupBoxHiperisoDevice->setLayout(deviceInfoLayout); + + auto *versionsLayout = new QHBoxLayout(); + versionsLayout->setSpacing(10); + versionsLayout->addWidget(ui->groupBoxHiperisoLocal, 1); + versionsLayout->addWidget(ui->groupBoxHiperisoDevice, 1); + + auto *statusLayout = new QVBoxLayout(); + statusLayout->setContentsMargins(10, 24, 10, 8); + statusLayout->addWidget(ui->progressBar); + ui->groupBoxStatus->setLayout(statusLayout); + + auto *buttonLayout = new QHBoxLayout(); + buttonLayout->addStretch(1); + buttonLayout->addWidget(ui->ButtonInstall); + buttonLayout->addSpacing(24); + buttonLayout->addWidget(ui->ButtonUpdate); + buttonLayout->addStretch(1); + + mainLayout->addWidget(ui->groupBoxDevice); + mainLayout->addLayout(versionsLayout); + mainLayout->addWidget(ui->groupBoxStatus); + mainLayout->addSpacing(6); + mainLayout->addLayout(buttonLayout); + mainLayout->addStretch(1); + + ui->labelHiperisoLocalVer->setMinimumHeight(48); + ui->labelHiperisoDeviceVer->setMinimumHeight(48); + ui->ButtonInstall->setMinimumWidth(120); + ui->ButtonUpdate->setMinimumWidth(120); +} + +bool LangCompare(const QString &s1, const QString &s2) +{ + if (true == s1.startsWith("Chinese Simplified") && false == s2.startsWith("Chinese Simplified")) + { + return true; + } + else if (false == s1.startsWith("Chinese Simplified") && true == s2.startsWith("Chinese Simplified")) + { + return false; + } + else + { + return s1 < s2; + } +} + +int Hiperiso2DiskWindow::lang_string(const QString &id, QString &str) +{ + QString cur = hiperiso_code_get_cur_language(); + + for (QJsonArray::iterator p = m_lang_array.begin(); p != m_lang_array.end(); p++) + { + if (p->toObject().value("name") == cur) + { + str = p->toObject().value(id).toString(); + str = str.replace("#@", "\r\n"); + return 0; + } + } + + return 1; +} + +void Hiperiso2DiskWindow::update_ui_language() +{ + QString dev; + QJsonObject obj; + QString cur = hiperiso_code_get_cur_language(); + + for (QJsonArray::iterator p = m_lang_array.begin(); p != m_lang_array.end(); p++) + { + if (p->toObject().value("name") == cur) + { + obj = p->toObject(); + break; + } + } + + ui->menuOption->setTitle(_LANG_STR("STR_MENU_OPTION")); + ui->actionSecure_Boot_Support->setText(_LANG_STR("STR_MENU_SECURE_BOOT")); + ui->menuPartition_Style->setTitle(_LANG_STR("STR_MENU_PART_STYLE")); + ui->actionPartition_Configuration->setText(_LANG_STR("STR_MENU_PART_CFG")); + ui->actionClear_Hiperiso->setText(_LANG_STR("STR_MENU_CLEAR")); + ui->actionShow_All_Devices->setText(_LANG_STR("STR_SHOW_ALL_DEV")); + + QAction *actNonDestr = findChild("actionInstall_Non_Destructive"); + if (actNonDestr) + { + actNonDestr->setText(_LANG_STR("STR_MENU_PART_RESIZE")); + } + + ui->menuHelp->setTitle(_LANG_STR("STR_MENU_HELP")); + ui->actionAbout->setText(_LANG_STR("STR_ABOUT")); + + dev = _LANG_STR("STR_DEVICE"); + if (m_partcfg->reserve) + { + QString str; + str.sprintf(" [ -%lld%s ]", (long long)m_partcfg->resvalue, m_partcfg->unit ? "GB" : "MB"); + ui->groupBoxDevice->setTitle(dev + str); + } + else + { + ui->groupBoxDevice->setTitle(dev); + } + + ui->groupBoxHiperisoLocal->setTitle(_LANG_STR("STR_LOCAL_VER")); + ui->groupBoxHiperisoDevice->setTitle(_LANG_STR("STR_DISK_VER")); + ui->groupBoxStatus->setTitle(_LANG_STR("STR_STATUS")); + ui->ButtonInstall->setText(_LANG_STR("STR_INSTALL")); + ui->ButtonUpdate->setText(_LANG_STR("STR_UPDATE")); + m_partcfg->update_language_ui(obj); + m_partcfg->setWindowTitle(_LANG_STR("STR_MENU_PART_CFG")); +} + +void Hiperiso2DiskWindow::lang_check_action(QAction *act) +{ + hiperiso_code_set_cur_language(act->text().toStdString().c_str()); + update_ui_language(); +} + +void Hiperiso2DiskWindow::LoadLanguages() +{ + QString curlang = hiperiso_code_get_cur_language(); + if (curlang.isEmpty()) + { + QString LANG = qgetenv("LANG"); + if (LANG.startsWith("zh_CN")) + { + hiperiso_code_set_cur_language("Chinese Simplified (简体中文)"); + } + else + { + hiperiso_code_set_cur_language("English (English)"); + } + curlang = hiperiso_code_get_cur_language(); + } + + + QFile inFile("./tool/languages.json"); + if (!inFile.open(QIODevice::ReadOnly|QIODevice::Text)) + { + ui->menuLanguage->setEnabled(false); + return; + } + QByteArray data = inFile.readAll(); + inFile.close(); + + QJsonParseError errorPtr; + QJsonDocument doc = QJsonDocument::fromJson(data, &errorPtr); + if (errorPtr.error != QJsonParseError::NoError || !doc.isArray()) + { + ui->menuLanguage->setEnabled(false); + return; + } + + m_lang_array = doc.array(); + if (m_lang_array.isEmpty()) + { + ui->menuLanguage->setEnabled(false); + return; + } + + QVector List; + for (QJsonArray::iterator p = m_lang_array.begin(); p != m_lang_array.end(); p++) + { + List.push_back(p->toObject().value("name").toString()); + } + + connect(m_lang_group, SIGNAL(triggered(QAction *)), this, SLOT(lang_check_action(QAction *))); + + std::sort(List.begin(), List.end(), LangCompare); + + for (QVector::iterator p = List.begin(); p != List.end(); p++) + { + QAction *action = new QAction(*p, m_lang_group); + action->setCheckable(true); + + if (p->compare(curlang) == 0) + { + action->setChecked(true); + m_lang_group->triggered(action); + } + + ui->menuLanguage->addAction(action); + } + + ui->menuLanguage->setEnabled(true); + + +} + +void Hiperiso2DiskWindow::part_style_check_action(QAction *action) +{ + int style = 0; + + if (action->text() == "MBR") + { + style = 0; + ui->labelHiperisoLocalPartStyle->setText("MBR"); + } + else + { + style = 1; + ui->labelHiperisoLocalPartStyle->setText("GPT"); + } + + if (style != hiperiso_code_get_cur_part_style()) + { + hiperiso_code_set_cur_part_style(style); + } +} + +static hiperiso_disk *select_active_dev(const QString &select, int *activeid) +{ + int i; + int alldev = hiperiso_code_get_cur_show_all(); + hiperiso_disk *cur = NULL; + + /* find the match one */ + if (!select.isEmpty()) + { + for (i = 0; i < g_disk_num; i++) + { + cur = g_disk_list + i; + if (alldev == 0 && cur->type != HISO_DEVICE_USB) + { + continue; + } + + if (select.compare(cur->disk_name) == 0) + { + *activeid = i; + return cur; + } + } + } + + /* find the first one that installed with Hiperiso */ + for (i = 0; i < g_disk_num; i++) + { + cur = g_disk_list + i; + if (alldev == 0 && cur->type != HISO_DEVICE_USB) + { + continue; + } + + if (cur->hisodata.hiperiso_valid) + { + *activeid = i; + return cur; + } + } + + /* find the first USB interface device */ + for (i = 0; i < g_disk_num; i++) + { + cur = g_disk_list + i; + if (alldev == 0 && cur->type != HISO_DEVICE_USB) + { + continue; + } + + if (cur->type == HISO_DEVICE_USB) + { + *activeid = i; + return cur; + } + } + + /* use the first one */ + for (i = 0; i < g_disk_num; i++) + { + cur = g_disk_list + i; + if (alldev == 0 && cur->type != HISO_DEVICE_USB) + { + continue; + } + + *activeid = i; + return cur; + } + + return NULL; +} + + +void Hiperiso2DiskWindow::FillDeviceList(const QString &select) +{ + int active; + int count = 0; + int alldev = hiperiso_code_get_cur_show_all(); + hiperiso_disk *cur; + + ui->comboBoxDevice->clear(); + + for (int i = 0; i < g_disk_num; i++) + { + cur = g_disk_list + i; + + if (alldev == 0 && cur->type != HISO_DEVICE_USB) + { + continue; + } + + QString item; + item.sprintf("%s [%s] %s", cur->disk_name, cur->human_readable_size, cur->disk_model); + ui->comboBoxDevice->addItem(item, i); + count++; + } + + cur = select_active_dev(select, &active); + if (cur) + { + vlog("combox count:%d, active:%s id:%d\n", count, cur->disk_name, active); + ui->ButtonInstall->setEnabled(true); + ui->ButtonUpdate->setEnabled(cur->hisodata.hiperiso_valid); + ui->comboBoxDevice->setCurrentIndex(ui->comboBoxDevice->findData(active)); + } + else + { + vlog("combox count:%d, no active id\n", count); + ui->ButtonInstall->setEnabled(false); + ui->ButtonUpdate->setEnabled(false); + } +} + + +void Hiperiso2DiskWindow::OnInitWindow(void) +{ + int len; + const uchar *data; + QIcon icon; + QPixmap pix1; + QPixmap pix2; + char ver[512]; + + ui->labelHiperisoLocalSecure->hide(); + + m_part_group->addAction(ui->actionMBR); + m_part_group->addAction(ui->actionGPT); + connect(m_part_group, SIGNAL(triggered(QAction *)), this, SLOT(part_style_check_action(QAction *))); + + if (hiperiso_code_get_cur_part_style()) + { + ui->actionGPT->setChecked(true); + m_part_group->triggered(ui->actionGPT); + } + else + { + ui->actionMBR->setChecked(true); + m_part_group->triggered(ui->actionMBR); + } + + snprintf(ver, sizeof(ver), VERSION_FMT, hiperiso_get_local_version()); + ui->labelHiperisoLocalVer->setText(QApplication::translate("Hiperiso2DiskWindow", ver, nullptr)); + + LoadLanguages(); + + data = (const uchar *)get_refresh_icon_raw_data(&len); + pix1.loadFromData(data, len); + icon.addPixmap(pix1); + ui->ButtonRefresh->setIcon(icon); + + data = (const uchar *)get_secure_icon_raw_data(&len); + pix2.loadFromData(data, len); + ui->labelHiperisoLocalSecure->setPixmap(pix2); + ui->labelHiperisoDeviceSecure->setPixmap(pix2); + + ui->labelHiperisoDeviceSecure->setHidden(true); + ui->labelHiperisoDeviceVer->setText(""); + ui->labelHiperisoDevicePartStyle->setText(""); + + ui->actionSecure_Boot_Support->trigger(); + + ui->actionShow_All_Devices->setChecked(hiperiso_code_get_cur_show_all()); + + connect(m_thread, &MyQThread::thread_event, this, &Hiperiso2DiskWindow::thread_event); + + FillDeviceList(""); +} + +void Hiperiso2DiskWindow::showEvent(QShowEvent *ev) +{ + QMainWindow::showEvent(ev); + OnInitWindow(); +} + +void Hiperiso2DiskWindow::on_ButtonInstall_clicked() +{ + int index; + quint64 size = 0, space = 0; + hiperiso_disk *cur; + QString title_warn, title_err, msg; + + lang_string("STR_ERROR", title_err); + lang_string("STR_WARNING", title_warn); + + if (m_thread->m_running || hiperiso_code_is_busy()) + { + lang_string("STR_WAIT_PROCESS", msg); + QMessageBox::warning(this, title_warn, msg); + return; + } + + index = ui->comboBoxDevice->currentData().toInt(); + if (index < 0 || index >= g_disk_num) + { + vlog("Invalid combobox current index %d\n", index); + return; + } + + cur = g_disk_list + index; + + if (cur->is4kn) + { + lang_string("STR_4KN_UNSUPPORTED", msg); + QMessageBox::critical(this, title_err, msg); + return; + } + + if (hiperiso_code_get_cur_part_style() == 0 && cur->size_in_byte > 2199023255552ULL) + { + lang_string("STR_DISK_2TB_MBR_ERROR", msg); + QMessageBox::critical(this, title_err, msg); + return; + } + + if (m_partcfg->reserve) + { + size = cur->size_in_byte / SIZE_1MB; + space = m_partcfg->resvalue; + if (m_partcfg->unit == 1) + { + space = m_partcfg->resvalue * 1024; + } + + if (size <= space || (size - space) <= HISOEFI_PART_BYTES / SIZE_1MB) + { + lang_string("STR_SPACE_VAL_INVALID", msg); + QMessageBox::critical(this, title_err, msg); + vlog("reserved space too big.\n"); + return; + } + } + + lang_string("STR_INSTALL_TIP", msg); + if (QMessageBox::Yes != QMessageBox::warning(this, title_warn, msg, QMessageBox::Yes | QMessageBox::No, QMessageBox::No)) + { + return; + } + + lang_string("STR_INSTALL_TIP2", msg); + if (QMessageBox::Yes != QMessageBox::warning(this, title_warn, msg, QMessageBox::Yes | QMessageBox::No, QMessageBox::No)) + { + return; + } + + ui->ButtonRefresh->setEnabled(false); + ui->ButtonInstall->setEnabled(false); + ui->ButtonUpdate->setEnabled(false); + + m_thread->m_type = THREAD_TYPE_INSTALL; + m_thread->m_index = index; + m_thread->m_reserve_space = space * SIZE_1MB; + m_thread->m_secureboot = ui->actionSecure_Boot_Support->isChecked(); + m_thread->m_align4K = m_partcfg->align; + m_thread->m_fs_type = m_partcfg->m_fs_type; + m_thread->m_cluster_size = m_partcfg->m_cluster_size; + m_thread->m_running = true; + + m_thread->start(); +} + +void Hiperiso2DiskWindow::on_ButtonUpdate_clicked() +{ + int index; + hiperiso_disk *cur; + QString title_info, title_warn, title_err, msg; + + lang_string("STR_ERROR", title_err); + lang_string("STR_WARNING", title_warn); + lang_string("STR_INFO", title_info); + + if (m_thread->m_running || hiperiso_code_is_busy()) + { + lang_string("STR_WAIT_PROCESS", msg); + QMessageBox::warning(this, title_warn, msg); + return; + } + + index = ui->comboBoxDevice->currentData().toInt(); + if (index < 0 || index >= g_disk_num) + { + vlog("Invalid combobox current index %d\n", index); + return; + } + + cur = g_disk_list + index; + if (cur->hisodata.hiperiso_valid == 0) + { + vlog("invalid hiperiso version"); + return; + } + + lang_string("STR_UPDATE_TIP", msg); + if (QMessageBox::Yes != QMessageBox::information(this, title_info, msg, QMessageBox::Yes | QMessageBox::No, QMessageBox::No)) + { + return; + } + + ui->ButtonRefresh->setEnabled(false); + ui->ButtonInstall->setEnabled(false); + ui->ButtonUpdate->setEnabled(false); + + m_thread->m_type = THREAD_TYPE_UPDATE; + m_thread->m_index = index; + m_thread->m_secureboot = ui->actionSecure_Boot_Support->isChecked(); + + m_thread->m_running = true; + m_thread->start(); +} + +void Hiperiso2DiskWindow::on_ButtonRefresh_clicked() +{ + QString title_warn, msg; + + if (m_thread->m_running || hiperiso_code_is_busy()) + { + lang_string("STR_WARNING", title_warn); + lang_string("STR_WAIT_PROCESS", msg); + QMessageBox::warning(this, title_warn, msg); + return; + } + + hiperiso_code_refresh_device(); + FillDeviceList(""); +} + +void Hiperiso2DiskWindow::on_comboBoxDevice_currentIndexChanged(int index) +{ + char ver[512]; + hiperiso_disk *cur; + + (void) index; + + ui->labelHiperisoDeviceSecure->setHidden(true); + ui->labelHiperisoDeviceVer->setText(""); + ui->labelHiperisoDevicePartStyle->setText(""); + + index = ui->comboBoxDevice->currentData().toInt(); + if (index < 0 || index >= g_disk_num) + { + vlog("invalid combobox index %d\n", index); + return; + } + + cur = g_disk_list + index; + if (cur->hisodata.hiperiso_valid) + { + if (cur->hisodata.secure_boot_flag) + { + ui->labelHiperisoDeviceSecure->setHidden(false); + } + else + { + ui->labelHiperisoDeviceSecure->setHidden(true); + } + + if ((int)(ui->actionSecure_Boot_Support->isChecked()) != cur->hisodata.secure_boot_flag) + { + ui->actionSecure_Boot_Support->trigger(); + } + + snprintf(ver, sizeof(ver), VERSION_FMT, cur->hisodata.hiperiso_ver); + ui->labelHiperisoDeviceVer->setText(QApplication::translate("Hiperiso2DiskWindow", ver, nullptr)); + ui->labelHiperisoDevicePartStyle->setText(cur->hisodata.partition_style ? "GPT" : "MBR"); + } + else + { + if (!(ui->actionSecure_Boot_Support->isChecked())) + { + ui->actionSecure_Boot_Support->trigger(); + } + } +} + +void Hiperiso2DiskWindow::on_actionPartition_Configuration_triggered() +{ + m_partcfg->update_ui_status(); + if (QDialog::Accepted == m_partcfg->exec()) + { + QString str; + QString dev; + lang_string("STR_DEVICE", dev); + + if (m_partcfg->reserve) + { + str.sprintf(" [ -%lld%s ]", (long long)m_partcfg->resvalue, m_partcfg->unit ? "GB" : "MB"); + ui->groupBoxDevice->setTitle(dev + str); + } + else + { + ui->groupBoxDevice->setTitle(dev); + } + } +} + +void Hiperiso2DiskWindow::on_actionClear_Hiperiso_triggered() +{ + int ret; + int index; + hiperiso_disk *cur; + QString title_err, title_warn, title_info, msg; + char disk_name[64]; + char buf[256]; + char out[256]; + + lang_string("STR_ERROR", title_err); + lang_string("STR_WARNING", title_warn); + lang_string("STR_INFO", title_info); + + if (m_thread->m_running || hiperiso_code_is_busy()) + { + lang_string("STR_WAIT_PROCESS", msg); + QMessageBox::warning(this, title_warn, msg); + return; + } + + index = ui->comboBoxDevice->currentData().toInt(); + if (index < 0 || index >= g_disk_num) + { + vlog("Invalid combobox current index %d\n", index); + return; + } + + cur = g_disk_list + index; + + lang_string("STR_INSTALL_TIP", msg); + if (QMessageBox::Yes != QMessageBox::warning(this, title_warn, msg, QMessageBox::Yes | QMessageBox::No, QMessageBox::No)) + { + return; + } + + lang_string("STR_INSTALL_TIP2", msg); + if (QMessageBox::Yes != QMessageBox::warning(this, title_warn, msg, QMessageBox::Yes | QMessageBox::No, QMessageBox::No)) + { + return; + } + + snprintf(disk_name, sizeof(disk_name), "%s", cur->disk_name); + snprintf(buf, sizeof(buf), "{\"method\":\"clean\",\"disk\":\"%s\"}", disk_name); + + out[0] = 0; + hiperiso_func_handler(buf, out, sizeof(out)); + vlog("func handler clean <%s>\n", out); + + if (strstr(out, "success")) + { + ret = hiperiso_code_get_result(); + hiperiso_code_refresh_device(); + cur = NULL; + } + else + { + ret = 1; + } + + if (ret == 0) + { + lang_string("STR_CLEAR_SUCCESS", msg); + QMessageBox::information(this, title_info, msg); + } + else + { + lang_string("STR_CLEAR_FAILED", msg); + QMessageBox::critical(this, title_err, msg); + } + + FillDeviceList(disk_name); +} + +void Hiperiso2DiskWindow::on_actionShow_All_Devices_toggled(bool arg1) +{ + hiperiso_code_set_cur_show_all(arg1); + FillDeviceList(""); +} + +void Hiperiso2DiskWindow::on_actionInstall_Non_Destructive_triggered() +{ + int index; + QString title_warn, title_err, msg; + + lang_string("STR_ERROR", title_err); + lang_string("STR_WARNING", title_warn); + + if (m_thread->m_running || hiperiso_code_is_busy()) + { + lang_string("STR_WAIT_PROCESS", msg); + QMessageBox::warning(this, title_warn, msg); + return; + } + + index = ui->comboBoxDevice->currentData().toInt(); + if (index < 0 || index >= g_disk_num) + { + vlog("Invalid combobox current index %d\n", index); + return; + } + + lang_string("STR_PART_RESIZE_TIP", msg); + if (QMessageBox::Yes != QMessageBox::warning(this, title_warn, msg, QMessageBox::Yes | QMessageBox::No, QMessageBox::No)) + { + return; + } + + ui->ButtonRefresh->setEnabled(false); + ui->ButtonInstall->setEnabled(false); + ui->ButtonUpdate->setEnabled(false); + + m_thread->m_type = THREAD_TYPE_INSTALL_NONDESTR; + m_thread->m_index = index; + m_thread->m_running = true; + + m_thread->start(); +} + + +void Hiperiso2DiskWindow::closeEvent(QCloseEvent *event) +{ + vlog("On closeEvent ...\n"); + + if (m_thread->m_running) + { + QString title; + QString msg; + + lang_string("STR_WARNING", title); + lang_string("STR_WAIT_PROCESS", msg); + QMessageBox::warning(this, title, msg); + + event->ignore(); + return; + } + + hiperiso_code_save_cfg(); + + event->accept(); +} + +void Hiperiso2DiskWindow::on_actionSecure_Boot_Support_triggered() +{ + ui->labelHiperisoLocalSecure->setHidden(!(ui->actionSecure_Boot_Support->isChecked())); +} + +void Hiperiso2DiskWindow::on_actionAbout_triggered() +{ + QString about = QStringLiteral( + "" + "

Hiperiso2Disk

" + "

Version %1

" + "

A hypervisor-based ISO boot tool with full boot logging.
" + "Powered by KVM/QEMU · Based on the Ventoy project.

" + "

Project page: " + "https://github.com/hiperiso/hiperiso

" + ""); + + about = about.arg(QString::fromUtf8(hiperiso_get_local_version())); + + QMessageBox box(this); + box.setWindowTitle("About Hiperiso"); + box.setIcon(QMessageBox::Information); + box.setTextFormat(Qt::RichText); + box.setText(about); + + for (QObject *child : box.children()) + { + QLabel *label = qobject_cast(child); + if (label) + { + label->setOpenExternalLinks(true); + label->setTextInteractionFlags(Qt::TextBrowserInteraction); + } + } + + box.exec(); +} + +void Hiperiso2DiskWindow::set_percent(int percent) +{ + QString status, radio; + + ui->progressBar->setValue(percent); + + lang_string("STR_STATUS", status); + + if (percent == 0) + { + ui->groupBoxStatus->setTitle(status); + } + else + { + radio.sprintf("%d%%", percent); + ui->groupBoxStatus->setTitle(status + " " + radio); + } +} + +void Hiperiso2DiskWindow::thread_event(int msg, int data) +{ + char disk_name[32]; + QString title_err, title_info, tipmsg; + + if (msg == THREAD_MSG_PROGRESS_BAR) + { + set_percent(data); + } + else if (msg == THREAD_MSG_INSTALL_FINISH) + { + lang_string("STR_ERROR", title_err); + lang_string("STR_INFO", title_info); + + if (data == 0) + { + lang_string("STR_INSTALL_SUCCESS", tipmsg); + QMessageBox::information(this, title_info, tipmsg); + } + else + { + lang_string("STR_INSTALL_FAILED", tipmsg); + QMessageBox::critical(this, title_err, tipmsg); + } + + set_percent(0); + ui->ButtonRefresh->setEnabled(true); + ui->ButtonInstall->setEnabled(true); + ui->ButtonUpdate->setEnabled(true); + + snprintf(disk_name, sizeof(disk_name), "%s", g_disk_list[m_thread->m_index].disk_name); + FillDeviceList(disk_name); + } + else if (msg == THREAD_MSG_UPDATE_FINISH) + { + lang_string("STR_ERROR", title_err); + lang_string("STR_INFO", title_info); + + if (data == 0) + { + lang_string("STR_UPDATE_SUCCESS", tipmsg); + QMessageBox::information(this, title_info, tipmsg); + } + else + { + lang_string("STR_UPDATE_FAILED", tipmsg); + QMessageBox::critical(this, title_err, tipmsg); + } + + set_percent(0); + ui->ButtonRefresh->setEnabled(true); + ui->ButtonInstall->setEnabled(true); + ui->ButtonUpdate->setEnabled(true); + + snprintf(disk_name, sizeof(disk_name), "%s", g_disk_list[m_thread->m_index].disk_name); + FillDeviceList(disk_name); + } + else if (msg == THREAD_MSG_INSTALL_NONDESTR_FINISH) + { + lang_string("STR_ERROR", title_err); + lang_string("STR_INFO", title_info); + + if (data == 0) + { + lang_string("STR_INSTALL_SUCCESS", tipmsg); + QMessageBox::information(this, title_info, tipmsg); + } + else + { + lang_string("STR_INSTALL_FAILED", tipmsg); + QMessageBox::critical(this, title_err, tipmsg); + } + + set_percent(0); + ui->ButtonRefresh->setEnabled(true); + ui->ButtonInstall->setEnabled(true); + ui->ButtonUpdate->setEnabled(true); + + snprintf(disk_name, sizeof(disk_name), "%s", g_disk_list[m_thread->m_index].disk_name); + FillDeviceList(disk_name); + } +} diff --git a/src/gui/QT/hiperiso2diskwindow.h b/src/gui/QT/hiperiso2diskwindow.h new file mode 100644 index 0000000..e0438f3 --- /dev/null +++ b/src/gui/QT/hiperiso2diskwindow.h @@ -0,0 +1,117 @@ +#ifndef HIPERISO2DISKWINDOW_H +#define HIPERISO2DISKWINDOW_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "partcfgdialog.h" + +QT_BEGIN_NAMESPACE +namespace Ui { class Hiperiso2DiskWindow; } +QT_END_NAMESPACE + +#define THREAD_TYPE_INSTALL 1 +#define THREAD_TYPE_UPDATE 2 +#define THREAD_TYPE_INSTALL_NONDESTR 3 + +#define THREAD_MSG_PROGRESS_BAR 1 +#define THREAD_MSG_INSTALL_FINISH 2 +#define THREAD_MSG_UPDATE_FINISH 3 +#define THREAD_MSG_INSTALL_NONDESTR_FINISH 4 + +class MyQThread : public QThread +{ + Q_OBJECT +public: + quint64 m_reserve_space; + int m_index; + int m_type; + int m_secureboot; + int m_align4K; + int m_fs_type; + int m_cluster_size; + bool m_running; + void install_run(); + void update_run(); + void install_nondestr_run(); + + explicit MyQThread(QObject *parent = nullptr); +protected: + void run(); +signals: + void thread_event(int msg, int data); +public slots: +}; + + +class Hiperiso2DiskWindow : public QMainWindow +{ + Q_OBJECT + +public: + Hiperiso2DiskWindow(QWidget *parent = nullptr); + ~Hiperiso2DiskWindow(); + + QActionGroup *m_part_group; + QActionGroup *m_lang_group; + QJsonArray m_lang_array; + PartCfgDialog *m_partcfg; + MyQThread *m_thread; + + void FillDeviceList(const QString &select); + void OnInitWindow(void); + void LoadLanguages(); + int lang_string(const QString &id, QString &str); + void update_ui_language(); + void set_percent(int percent); + void setup_runtime_layout(); +protected: + void showEvent(QShowEvent *ev); + void closeEvent(QCloseEvent *event); + +private slots: + + void thread_event(int msg, int data); + void part_style_check_action(QAction *act); + void lang_check_action(QAction *act); + + void on_ButtonInstall_clicked(); + + void on_ButtonUpdate_clicked(); + + void on_ButtonRefresh_clicked(); + + void on_comboBoxDevice_currentIndexChanged(int index); + + void on_actionPartition_Configuration_triggered(); + + void on_actionClear_Hiperiso_triggered(); + + void on_actionShow_All_Devices_toggled(bool arg1); + + void on_actionSecure_Boot_Support_triggered(); + + void on_actionInstall_Non_Destructive_triggered(); + + void on_actionAbout_triggered(); + +private: + Ui::Hiperiso2DiskWindow *ui; + + +}; + +#define _LANG_STR(id) obj.value(id).toString() +#define VERSION_FMT "

%s

" + +#endif // HIPERISO2DISKWINDOW_H diff --git a/src/gui/QT/hiperiso2diskwindow.ui b/src/gui/QT/hiperiso2diskwindow.ui new file mode 100644 index 0000000..e0a3e3b --- /dev/null +++ b/src/gui/QT/hiperiso2diskwindow.ui @@ -0,0 +1,341 @@ + + + Hiperiso2DiskWindow + + + + 0 + 0 + 696 + 418 + + + + + 696 + 418 + + + + Hiperiso2Disk + + + + + + 12 + 11 + 672 + 88 + + + + Device + + + + + 12 + 44 + 600 + 29 + + + + + + + 624 + 41 + 36 + 33 + + + + + + + + ../refresh.ico../refresh.ico + + + + 24 + 24 + + + + + + + + 12 + 110 + 330 + 88 + + + + Hiperiso In Package + + + Qt::AlignCenter + + + + + 36 + 33 + 240 + 45 + + + + <html><head/><body><p><span style=" font-size:20pt; font-weight:600; color:#2d8e57;">1.0.53</span></p></body></html> + + + Qt::AlignCenter + + + + + + 286 + 66 + 37 + 20 + + + + <html><head/><body><p>MBR</p></body></html> + + + + + + 14 + 40 + 25 + 34 + + + + + + + ../secure.ico + + + + + + + 354 + 110 + 330 + 88 + + + + Hiperiso In Device + + + Qt::AlignCenter + + + + + 36 + 33 + 240 + 45 + + + + <html><head/><body><p><span style=" font-size:20pt; font-weight:600; color:#2d8e57;">1.0.52</span></p></body></html> + + + Qt::AlignCenter + + + + + + 286 + 66 + 37 + 20 + + + + <html><head/><body><p>GPT</p></body></html> + + + + + + 14 + 40 + 25 + 34 + + + + + + + ../secure.ico + + + + + + + 12 + 209 + 672 + 67 + + + + Status: READY + + + + + 12 + 33 + 648 + 25 + + + + 0 + + + true + + + %p% + + + + + + + 180 + 302 + 121 + 45 + + + + Install + + + + + + 396 + 302 + 121 + 45 + + + + Update + + + + + + + 0 + 0 + 696 + 25 + + + + + Option + + + + Partition Style + + + + + + + + + + + + + Language + + + + + Help + + + + + + + + + + true + + + Secure Boot Support + + + + + true + + + MBR + + + + + true + + + GPT + + + + + Partition Configuration + + + + + Clear Hiperiso + + + + + true + + + Show All Devices + + + + + About + + + + + + diff --git a/src/gui/QT/hiperiso_qt.h b/src/gui/QT/hiperiso_qt.h new file mode 100644 index 0000000..3afb4c6 --- /dev/null +++ b/src/gui/QT/hiperiso_qt.h @@ -0,0 +1,47 @@ +/****************************************************************************** + * hiperiso_qt.h + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#ifndef __HIPERISO_QT_H__ +#define __HIPERISO_QT_H__ + +int hiperiso_disk_init(void); +void hiperiso_disk_exit(void); +int hiperiso_http_init(void); +void hiperiso_http_exit(void); +int hiperiso_log_init(void); +void hiperiso_log_exit(void); +void *get_refresh_icon_raw_data(int *len); +void *get_secure_icon_raw_data(int *len); +void *get_window_icon_raw_data(int *len); +int hiperiso_func_handler(const char *jsonstr, char *jsonbuf, int buflen); +const char * hiperiso_code_get_cur_language(void); +int hiperiso_code_get_cur_part_style(void); +void hiperiso_code_set_cur_part_style(int style); +int hiperiso_code_get_cur_show_all(void); +void hiperiso_code_set_cur_show_all(int show_all); +void hiperiso_code_set_cur_language(const char *lang); +void hiperiso_code_save_cfg(void); +void hiperiso_code_refresh_device(void); +int hiperiso_code_is_busy(void); +int hiperiso_code_get_percent(void); +int hiperiso_code_get_result(void); + +#endif /* __HIPERISO_QT_H__ */ + + diff --git a/src/gui/QT/hiperiso_qt_stub.c b/src/gui/QT/hiperiso_qt_stub.c new file mode 100644 index 0000000..2e0bcac --- /dev/null +++ b/src/gui/QT/hiperiso_qt_stub.c @@ -0,0 +1,600 @@ +/****************************************************************************** + * hiperiso_qt_stub.c + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +struct mg_context * +mg_start(const struct mg_callbacks *callbacks, + void *user_data, + const char **options) +{ + (void)callbacks; + (void)user_data; + (void)options; + + return NULL; +} + +void mg_stop(struct mg_context *ctx) +{ + (void)ctx; +} + +int mg_read(struct mg_connection *conn, void *buf, size_t len) +{ + (void)conn; + (void)buf; + (void)len; + return 0; +} + + +const struct mg_request_info * mg_get_request_info(const struct mg_connection *conn) +{ + (void)conn; + return NULL; +} + +int mg_start_thread(mg_thread_func_t func, void *param) +{ + pthread_t thread_id; + pthread_attr_t attr; + int result; + + (void)pthread_attr_init(&attr); + (void)pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + +#if defined(USE_STACK_SIZE) && (USE_STACK_SIZE > 1) + /* Compile-time option to control stack size, + * e.g. -DUSE_STACK_SIZE=16384 */ + (void)pthread_attr_setstacksize(&attr, USE_STACK_SIZE); +#endif /* defined(USE_STACK_SIZE) && (USE_STACK_SIZE > 1) */ + + result = pthread_create(&thread_id, &attr, func, param); + pthread_attr_destroy(&attr); + + return result; +} + +int mg_printf(struct mg_connection *conn, const char *fmt, ...) +{ + (void)conn; + (void)fmt; + + return 0; +} + +static unsigned char window_icon_hexData[] = { + 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, + 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x08, 0x06, 0x00, 0x00, 0x00, 0xAA, 0x69, 0x71, + 0xDE, 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4D, 0x41, 0x00, 0x00, 0xAF, 0xC8, 0x37, 0x05, 0x8A, + 0xE9, 0x00, 0x00, 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x26, 0x00, 0x00, 0x80, + 0x84, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x80, 0xE8, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xEA, + 0x60, 0x00, 0x00, 0x3A, 0x98, 0x00, 0x00, 0x17, 0x70, 0x9C, 0xBA, 0x51, 0x3C, 0x00, 0x00, 0x00, + 0x06, 0x62, 0x4B, 0x47, 0x44, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xA0, 0xBD, 0xA7, 0x93, 0x00, + 0x00, 0x00, 0x07, 0x74, 0x49, 0x4D, 0x45, 0x07, 0xE4, 0x03, 0x17, 0x04, 0x10, 0x05, 0xF6, 0xCE, + 0xA8, 0xC0, 0x00, 0x00, 0x1C, 0x68, 0x49, 0x44, 0x41, 0x54, 0x78, 0xDA, 0xCD, 0x9B, 0x79, 0x94, + 0x1D, 0x57, 0x7D, 0xE7, 0x3F, 0xF7, 0xDE, 0xAA, 0x7A, 0xFB, 0xEB, 0xD7, 0xBB, 0xA4, 0x56, 0xCB, + 0xDA, 0x6C, 0x59, 0xB6, 0x64, 0x83, 0x91, 0x17, 0xBC, 0xE1, 0x0D, 0x2F, 0x04, 0x1B, 0xB0, 0x43, + 0x3C, 0x40, 0x32, 0x43, 0x4E, 0x38, 0x19, 0x87, 0x43, 0x26, 0x03, 0x84, 0x98, 0xC9, 0x1C, 0x98, + 0x93, 0x70, 0x48, 0x72, 0x66, 0x58, 0x86, 0x81, 0x10, 0x0E, 0x06, 0xC6, 0x21, 0xC1, 0x83, 0xC1, + 0x36, 0x18, 0xDB, 0x6C, 0xC6, 0x60, 0xB0, 0x65, 0xBC, 0x1B, 0x5B, 0x8B, 0x6D, 0x59, 0x92, 0xB5, + 0x75, 0x5B, 0x52, 0xAB, 0xD7, 0xB7, 0x56, 0xD5, 0x5D, 0xE6, 0x8F, 0xAA, 0xF7, 0xF4, 0xBA, 0xD5, + 0xF2, 0xC2, 0x92, 0x99, 0x3A, 0xE7, 0xD7, 0xF5, 0x96, 0x7A, 0x75, 0x7F, 0xDF, 0xEF, 0x6F, 0xB9, + 0xBF, 0xFB, 0xBB, 0xD5, 0x82, 0xDF, 0xD1, 0x61, 0x8C, 0x45, 0x7D, 0x70, 0x9A, 0xFD, 0x7F, 0x57, + 0x61, 0x57, 0xD5, 0x31, 0x17, 0x39, 0x9C, 0x83, 0xD8, 0xC1, 0xEF, 0xAF, 0x1A, 0xE6, 0xC9, 0x23, + 0x13, 0x41, 0x55, 0xA3, 0xB4, 0x75, 0xD2, 0x93, 0xB8, 0xBC, 0x27, 0xCC, 0xA6, 0x7E, 0x19, 0xDD, + 0xBA, 0x5B, 0xBB, 0xBC, 0x07, 0x02, 0x28, 0x78, 0x82, 0xD1, 0xA2, 0x60, 0x6D, 0x59, 0x52, 0x8F, + 0x1D, 0xC5, 0x40, 0xFE, 0xD6, 0xF5, 0x14, 0xBF, 0xED, 0x1B, 0x3E, 0xBC, 0x67, 0x92, 0x3C, 0x9A, + 0x03, 0xAE, 0x44, 0x84, 0xC7, 0xDB, 0x56, 0xFA, 0x3C, 0x3A, 0x61, 0x7A, 0x26, 0x43, 0x96, 0x59, + 0xEB, 0xD6, 0x6A, 0xC7, 0x09, 0x16, 0x46, 0x05, 0xF4, 0x03, 0x79, 0x01, 0xBE, 0x03, 0x03, 0x34, + 0x81, 0x19, 0x21, 0x18, 0xF3, 0x05, 0x7B, 0x95, 0x10, 0xBB, 0x8A, 0x3E, 0xFB, 0xCE, 0x1B, 0x56, + 0xD3, 0x77, 0xEC, 0x89, 0x4D, 0x5E, 0x5A, 0xFA, 0x5C, 0x9D, 0x59, 0xF2, 0xAC, 0x72, 0x87, 0x39, + 0x71, 0xD5, 0x09, 0xFF, 0x7F, 0x11, 0xF0, 0xD3, 0x17, 0x67, 0xC9, 0xA1, 0x99, 0xB0, 0x39, 0xBE, + 0x19, 0xE6, 0x78, 0x5F, 0xA1, 0xD1, 0x17, 0x4B, 0xFF, 0x8C, 0x96, 0x11, 0x17, 0x59, 0xC7, 0xD9, + 0xC6, 0xB1, 0xCE, 0x41, 0x9F, 0x14, 0xE4, 0x3C, 0x89, 0x54, 0x02, 0x94, 0x48, 0x14, 0x70, 0x80, + 0x75, 0x60, 0x8E, 0x4A, 0x53, 0xC0, 0x9C, 0x27, 0xD8, 0x2D, 0x04, 0x8F, 0x67, 0x24, 0xF7, 0x07, + 0xE8, 0x47, 0x2E, 0x52, 0xDF, 0x19, 0xBF, 0x3B, 0xBC, 0xD6, 0x55, 0x44, 0xC8, 0x6E, 0xBF, 0xCC, + 0x99, 0xCD, 0x3D, 0x9C, 0xB2, 0x76, 0xD5, 0xFF, 0x5B, 0x02, 0x7E, 0xBE, 0x6B, 0x92, 0x3E, 0xD1, + 0x64, 0x8F, 0xA9, 0x70, 0xF5, 0x89, 0x05, 0xBE, 0xBF, 0xBB, 0xB1, 0xAA, 0xE5, 0xD4, 0xD5, 0x06, + 0xF1, 0x76, 0xE3, 0xC4, 0xEB, 0x8D, 0xA3, 0x22, 0x05, 0xE4, 0x3C, 0x41, 0xD1, 0x83, 0xAC, 0x27, + 0x08, 0x24, 0xC8, 0x14, 0x7C, 0x9B, 0x80, 0x36, 0x09, 0xDA, 0x41, 0x4B, 0x3B, 0xEA, 0x1A, 0x1A, + 0xDA, 0x61, 0x1C, 0x28, 0x41, 0xC3, 0x13, 0xEE, 0x79, 0x0F, 0xEE, 0xC9, 0x48, 0x73, 0xC7, 0x3A, + 0x6F, 0x66, 0xCB, 0x56, 0x3D, 0xA0, 0x4F, 0xC8, 0x69, 0xE6, 0xB4, 0xE4, 0xFC, 0x91, 0xEC, 0xBF, + 0x3D, 0x01, 0x8F, 0xFE, 0x6A, 0x2B, 0xBB, 0x4B, 0xEB, 0xA9, 0x98, 0x39, 0x76, 0xDB, 0x0A, 0xAB, + 0xBC, 0xEA, 0xB2, 0x3A, 0xFE, 0xBB, 0x0D, 0xF2, 0xDF, 0x6B, 0xCB, 0x29, 0x91, 0x75, 0x4A, 0x20, + 0xA8, 0x64, 0x04, 0xBD, 0x19, 0x41, 0xCE, 0x13, 0x2C, 0x16, 0xC1, 0xEE, 0x38, 0x8A, 0x38, 0x20, + 0x34, 0x30, 0x1B, 0x39, 0xA6, 0x42, 0x8B, 0x76, 0x90, 0x91, 0x10, 0x48, 0xF6, 0x79, 0xC2, 0xDD, + 0x9E, 0xF7, 0xF8, 0xCA, 0xE5, 0x37, 0xFB, 0xDB, 0xEF, 0x7B, 0x6F, 0xCC, 0x25, 0xA3, 0x9A, 0xA7, + 0x0E, 0x29, 0xCE, 0x58, 0x92, 0xFB, 0xB7, 0x21, 0xE0, 0x91, 0xFD, 0x73, 0x9C, 0x55, 0xAE, 0xF2, + 0x9D, 0xC3, 0x15, 0x86, 0x5D, 0x35, 0xFB, 0x12, 0xA5, 0xAB, 0x62, 0x27, 0x3F, 0xA8, 0x11, 0xE7, + 0xB6, 0x0C, 0x2A, 0x32, 0x8E, 0x9E, 0x40, 0xB0, 0xAC, 0xA0, 0x28, 0x78, 0xA2, 0x33, 0x8A, 0x7B, + 0x8D, 0xE3, 0xB4, 0x95, 0x0B, 0x8D, 0xE3, 0x50, 0xD3, 0x72, 0xA4, 0x65, 0x51, 0x42, 0x50, 0xF0, + 0xC0, 0x97, 0xE2, 0xD9, 0x8C, 0x74, 0xFF, 0x34, 0x98, 0x71, 0xDF, 0xD8, 0xDF, 0x10, 0x53, 0xEB, + 0x8A, 0x9A, 0x99, 0x58, 0x72, 0xD1, 0x8A, 0xFC, 0xEF, 0x96, 0x80, 0x7B, 0x76, 0xD6, 0xE9, 0x0F, + 0x0C, 0x4F, 0xCD, 0x78, 0xAC, 0xC8, 0x9B, 0xD1, 0xAA, 0x96, 0x1F, 0x8E, 0x91, 0xEF, 0x6D, 0x69, + 0xD7, 0x53, 0xD7, 0x09, 0xC4, 0xD1, 0xA2, 0x62, 0x28, 0x2F, 0x51, 0x42, 0xBC, 0x66, 0xD0, 0xC7, + 0x3F, 0x1C, 0xD3, 0xA1, 0x63, 0x6F, 0xD5, 0x10, 0x19, 0x47, 0xD1, 0x97, 0xE4, 0x7D, 0x11, 0x65, + 0x25, 0xDF, 0xCF, 0x7A, 0x7C, 0xE2, 0xA1, 0xC9, 0xE0, 0xC9, 0x2B, 0x07, 0x1A, 0xB4, 0x2C, 0xBC, + 0x79, 0x55, 0xF1, 0x77, 0x43, 0xC0, 0x3D, 0xCF, 0xCF, 0x90, 0x55, 0xF0, 0xAB, 0x39, 0x9F, 0x35, + 0x25, 0x77, 0x66, 0x4D, 0x8B, 0x7F, 0x88, 0x0C, 0x17, 0xD7, 0x62, 0x27, 0x1A, 0xDA, 0xE1, 0x2B, + 0xC1, 0xEA, 0x1E, 0x45, 0x7F, 0x4E, 0x26, 0xC0, 0x7F, 0x7B, 0xE8, 0x13, 0x65, 0x05, 0xD4, 0x63, + 0xC7, 0xAE, 0x19, 0x43, 0x2D, 0x76, 0xE4, 0x3D, 0x41, 0x29, 0x10, 0xE4, 0x3D, 0xB1, 0xBD, 0xA0, + 0xDC, 0xC7, 0x2E, 0xAC, 0x34, 0xEE, 0x7C, 0x6A, 0xCE, 0x37, 0xA1, 0x15, 0x5C, 0xBE, 0xA6, 0xFC, + 0xDB, 0x25, 0xE0, 0x7B, 0xCF, 0xCD, 0x90, 0x53, 0x8E, 0xB7, 0x6C, 0xAF, 0xF0, 0x8D, 0x75, 0xF5, + 0x37, 0x37, 0x0D, 0x9F, 0x69, 0x6A, 0xB7, 0xA1, 0x1A, 0x39, 0x5A, 0xC6, 0xE1, 0x29, 0xC1, 0x89, + 0x15, 0x8F, 0xFE, 0x9C, 0xE4, 0x77, 0x80, 0xBD, 0x73, 0x48, 0xA0, 0x16, 0x3B, 0x76, 0x4C, 0x6B, + 0xEA, 0xDA, 0x91, 0x51, 0x82, 0x1E, 0x5F, 0x52, 0x0A, 0xC4, 0xE1, 0x82, 0xE7, 0xFE, 0xE6, 0x94, + 0x5C, 0xFD, 0xA6, 0xFD, 0x61, 0x10, 0x87, 0x16, 0xAE, 0x5A, 0x5B, 0xF9, 0xED, 0x10, 0x70, 0xCF, + 0x73, 0x53, 0x64, 0x14, 0xFC, 0x7C, 0xAA, 0xC0, 0x86, 0x52, 0x78, 0x45, 0xC3, 0x88, 0x2F, 0xD4, + 0x22, 0xB7, 0x76, 0x2E, 0xB2, 0xC4, 0xD6, 0x81, 0x10, 0xAC, 0x2C, 0x7B, 0x8C, 0x94, 0xD4, 0xEF, + 0x08, 0xF6, 0x02, 0xA5, 0x05, 0x4C, 0xB5, 0x2C, 0x3B, 0xA6, 0x35, 0xDA, 0x3A, 0x7C, 0x29, 0x28, + 0x07, 0x92, 0xDE, 0xAC, 0x9C, 0x2B, 0x2A, 0xF7, 0xF1, 0x8D, 0xF9, 0xD9, 0x7F, 0xDC, 0xD3, 0xCA, + 0xE9, 0xD8, 0x49, 0xAE, 0x3C, 0xF1, 0xE5, 0x49, 0x78, 0x45, 0x02, 0x7E, 0xB6, 0x65, 0x0F, 0x85, + 0x5C, 0x86, 0x87, 0x66, 0x0A, 0x0C, 0xE7, 0x38, 0xAF, 0x1E, 0xBB, 0x9B, 0x6A, 0x91, 0x5D, 0x3F, + 0x1B, 0x3A, 0x62, 0xE7, 0x70, 0x40, 0x5F, 0xCE, 0x63, 0x5D, 0x9F, 0x8F, 0xFA, 0xED, 0x17, 0x6A, + 0xC7, 0x1C, 0xCE, 0xB9, 0x8E, 0xD2, 0x7B, 0xAB, 0x86, 0x03, 0x55, 0x8D, 0x00, 0x3C, 0x29, 0xE8, + 0xC9, 0x48, 0xFA, 0xB2, 0x72, 0xAA, 0xE8, 0xF1, 0x97, 0xEF, 0x28, 0xEF, 0xBB, 0xF9, 0xFE, 0xFA, + 0x52, 0x67, 0x10, 0x5C, 0xB6, 0xB6, 0xF7, 0xD7, 0x27, 0xC0, 0x39, 0xF8, 0xCA, 0xD3, 0x73, 0xF4, + 0xA8, 0xE8, 0xD4, 0xD9, 0xD8, 0xBB, 0xB9, 0x1A, 0xD9, 0x4D, 0x33, 0x2D, 0x43, 0xEC, 0x12, 0x37, + 0xF7, 0x94, 0xE0, 0xA4, 0xBE, 0x80, 0xBE, 0xAC, 0x24, 0x75, 0x86, 0xDF, 0x00, 0xDD, 0x02, 0x8D, + 0x1C, 0xB8, 0xF6, 0x24, 0xE2, 0xC0, 0x5A, 0x43, 0xD6, 0x4B, 0x94, 0x0A, 0x2D, 0x84, 0x56, 0xF2, + 0xEC, 0x64, 0x4C, 0x33, 0x76, 0x08, 0x01, 0x9E, 0x84, 0xDE, 0xAC, 0xA2, 0x3F, 0xA7, 0xC6, 0xCB, + 0x9E, 0xFD, 0x8F, 0x7B, 0x9B, 0xFE, 0xDD, 0x67, 0x97, 0xE6, 0x88, 0x1B, 0x35, 0x2E, 0x38, 0xED, + 0xC4, 0xD7, 0x4E, 0xC0, 0x37, 0x9F, 0x3C, 0x08, 0x52, 0x92, 0x51, 0xF4, 0x1F, 0x89, 0xBC, 0x2F, + 0x57, 0x43, 0x7B, 0xED, 0x54, 0xD3, 0x10, 0xA6, 0x48, 0x9D, 0x80, 0xBE, 0xAC, 0xE2, 0xA4, 0xBE, + 0x00, 0x29, 0x39, 0xFE, 0xA4, 0xFE, 0x5A, 0x80, 0x2F, 0x76, 0x0F, 0x07, 0xD6, 0x6A, 0x7A, 0x02, + 0x38, 0x7D, 0xB8, 0x40, 0x64, 0x0C, 0x4F, 0xBD, 0x54, 0x25, 0x72, 0x1E, 0xFB, 0xEB, 0x30, 0x56, + 0x35, 0x9D, 0xCB, 0x7D, 0x29, 0x18, 0xC8, 0x4B, 0x06, 0x72, 0xEA, 0xE9, 0x5E, 0xCF, 0xFC, 0x61, + 0x9D, 0xCC, 0xD6, 0xEB, 0x4F, 0x2E, 0x1C, 0xD7, 0x32, 0xC7, 0x55, 0xF5, 0xAE, 0x87, 0xB6, 0x60, + 0x72, 0x15, 0xCE, 0x29, 0x4F, 0xC9, 0x7B, 0xA6, 0x47, 0x6E, 0x9C, 0x0D, 0xED, 0xDF, 0x4E, 0x36, + 0xB4, 0xD7, 0xD0, 0xC9, 0xAF, 0x84, 0x4C, 0x7E, 0xBA, 0xB2, 0x12, 0xB0, 0xA4, 0xE8, 0xFD, 0x06, + 0x66, 0xEF, 0xC2, 0xED, 0x1C, 0xCE, 0x5A, 0x04, 0x0E, 0x87, 0x40, 0xC8, 0x34, 0xA1, 0x9A, 0x98, + 0xC1, 0xBC, 0xE4, 0x75, 0x4B, 0x0B, 0xE4, 0x14, 0x78, 0x4A, 0xB1, 0x7F, 0xA6, 0xC9, 0xD3, 0x2F, + 0x55, 0x99, 0x8C, 0x3C, 0x76, 0xCC, 0x58, 0x8C, 0x13, 0x1D, 0x40, 0x19, 0x4F, 0xB0, 0xA4, 0xE0, + 0x31, 0x90, 0x93, 0xB7, 0x0C, 0xFB, 0xD1, 0x0D, 0x4D, 0x2B, 0xAB, 0x9E, 0x89, 0xB8, 0x72, 0xE3, + 0xC8, 0x31, 0xE3, 0x1E, 0x37, 0x6A, 0xDF, 0xAA, 0x7F, 0xCA, 0x78, 0x5C, 0xE0, 0x47, 0x53, 0x43, + 0x6F, 0xAC, 0x85, 0xF6, 0xFD, 0xD3, 0xF5, 0xD8, 0xAB, 0xB6, 0x34, 0xDA, 0x18, 0x8C, 0xB5, 0x68, + 0x63, 0xC1, 0x39, 0x32, 0x0A, 0xB4, 0x71, 0xC4, 0xDA, 0xFE, 0x46, 0x12, 0x45, 0x31, 0x26, 0x0E, + 0x59, 0x5E, 0x70, 0x9C, 0x36, 0xE8, 0x51, 0x10, 0x21, 0xAD, 0x56, 0x83, 0x28, 0x6C, 0xB2, 0xB4, + 0x20, 0xD8, 0xB4, 0xAC, 0x40, 0xC9, 0x97, 0x6C, 0xDD, 0x77, 0x80, 0x7D, 0x13, 0x47, 0x58, 0x51, + 0xC9, 0xB1, 0x7E, 0x30, 0x4F, 0xC6, 0x85, 0x48, 0x13, 0xA1, 0xB5, 0xC6, 0x18, 0x83, 0x36, 0x86, + 0x46, 0xA8, 0x99, 0xA8, 0x45, 0xCC, 0xB6, 0xEC, 0x3B, 0x26, 0x63, 0x75, 0xFD, 0x77, 0xF4, 0x00, + 0x81, 0x6D, 0xBD, 0x7A, 0x0F, 0xF8, 0xC1, 0x63, 0xDB, 0x99, 0xB2, 0x25, 0xF2, 0x52, 0x17, 0xC7, + 0xE3, 0xDC, 0x57, 0x26, 0x6B, 0xFA, 0xFA, 0x89, 0xBA, 0x26, 0xC6, 0x21, 0xA4, 0x44, 0xC8, 0xA4, + 0xC0, 0xC9, 0xF9, 0x92, 0x93, 0x07, 0x32, 0x04, 0xF2, 0x37, 0x5B, 0x52, 0x58, 0x6B, 0xC8, 0x49, + 0xCD, 0xE9, 0x4B, 0x72, 0xAC, 0xEA, 0xCB, 0xE3, 0x49, 0xC1, 0x74, 0x23, 0xE2, 0xA9, 0x03, 0xD3, + 0x14, 0x32, 0x3E, 0xA7, 0x8F, 0x54, 0x08, 0x54, 0xB2, 0x72, 0x98, 0x6B, 0xB6, 0x70, 0xCE, 0x51, + 0x29, 0xE4, 0x70, 0x08, 0xB6, 0x1F, 0x9C, 0xE5, 0xB6, 0x2D, 0x87, 0x99, 0x8C, 0x33, 0x48, 0xCF, + 0x4F, 0x6D, 0xEA, 0xF0, 0x84, 0x60, 0xB0, 0xE0, 0x31, 0x52, 0xF2, 0x7F, 0x35, 0xE0, 0xC7, 0xD7, + 0xC5, 0x4E, 0xEE, 0x56, 0x71, 0x9D, 0xB7, 0x6F, 0x5A, 0xFD, 0xCA, 0x1E, 0x30, 0x68, 0x27, 0x19, + 0x0B, 0xB3, 0x4C, 0x84, 0xEA, 0xD2, 0x6A, 0x53, 0xBF, 0x65, 0xAA, 0x1E, 0xD2, 0x8C, 0x35, 0xDA, + 0xD8, 0x84, 0x65, 0x9D, 0x88, 0xB3, 0x16, 0x63, 0x1D, 0x91, 0xB1, 0xBF, 0xB6, 0xB4, 0xA2, 0x88, + 0x2C, 0x11, 0x67, 0x2E, 0xCD, 0xB1, 0xBA, 0x37, 0x07, 0xCE, 0x11, 0x6B, 0x43, 0x29, 0x50, 0x9C, + 0x73, 0x42, 0x1F, 0xA7, 0x2D, 0x2D, 0xA3, 0x70, 0x98, 0x74, 0xEC, 0x42, 0xE0, 0x53, 0xCA, 0x66, + 0x98, 0xAB, 0x37, 0xA9, 0x37, 0x5B, 0x9C, 0x3C, 0x54, 0xE2, 0xCC, 0x65, 0x79, 0x6C, 0x73, 0x96, + 0x38, 0x0C, 0xD1, 0x5A, 0xA3, 0xB5, 0x25, 0x8C, 0x0D, 0x93, 0xF5, 0x88, 0x99, 0xA6, 0x3E, 0xBD, + 0xAA, 0xE5, 0xBB, 0xAF, 0x7D, 0xF6, 0x1A, 0xA1, 0xCC, 0xB1, 0x5E, 0x70, 0x8C, 0xE9, 0xA6, 0x1B, + 0x31, 0xF7, 0x3E, 0x77, 0x84, 0xDE, 0x9C, 0x2A, 0x6E, 0x3B, 0x14, 0x7E, 0xFD, 0xE0, 0x5C, 0xF4, + 0x8E, 0x89, 0x5A, 0x8C, 0x41, 0x20, 0x94, 0x48, 0x62, 0x5F, 0x08, 0x1C, 0x82, 0x52, 0x46, 0x72, + 0x62, 0x7F, 0x8E, 0x5F, 0xCF, 0x01, 0x1C, 0xC6, 0x68, 0x7A, 0x7C, 0xC3, 0x79, 0x2B, 0x4A, 0x8C, + 0xF4, 0xE4, 0xB0, 0xCE, 0xE1, 0x52, 0xE9, 0x56, 0x31, 0x36, 0x1A, 0x29, 0x25, 0x9E, 0x94, 0x38, + 0xE7, 0x90, 0x52, 0x72, 0x60, 0x72, 0x8A, 0x17, 0xC6, 0x0E, 0x72, 0xEE, 0x29, 0xEB, 0x90, 0x42, + 0xF0, 0xBD, 0xAD, 0xE3, 0xDC, 0xFF, 0x62, 0x1D, 0x82, 0x22, 0x88, 0xA4, 0x1E, 0x51, 0x02, 0x06, + 0x0B, 0x3E, 0x2B, 0x2B, 0xC1, 0xF6, 0x01, 0x3F, 0xBE, 0x26, 0x76, 0x62, 0x97, 0x98, 0x1D, 0xE3, + 0x0F, 0x2E, 0x3D, 0xFB, 0xF8, 0x1E, 0xD0, 0x9B, 0xBF, 0x86, 0xC3, 0x35, 0xCD, 0x4B, 0x35, 0x73, + 0x66, 0xB5, 0x19, 0x5F, 0x38, 0x53, 0x0D, 0x09, 0x23, 0xDD, 0xB1, 0xBA, 0xD6, 0x36, 0x15, 0x43, + 0x14, 0x1B, 0xC2, 0x58, 0x13, 0xC5, 0xE6, 0x35, 0x8A, 0xA6, 0x15, 0x86, 0xE4, 0x08, 0x39, 0x67, + 0x24, 0xCF, 0xD2, 0x72, 0x06, 0x6D, 0x0C, 0xD6, 0xDA, 0x8E, 0x98, 0xF4, 0xBD, 0xB3, 0x06, 0x09, + 0x34, 0x5A, 0x2D, 0x9A, 0x61, 0x88, 0x73, 0x0E, 0xA3, 0x35, 0x4B, 0x2A, 0x3D, 0xAC, 0x18, 0x1A, + 0x24, 0xD6, 0x1A, 0xE1, 0x2C, 0x67, 0x8E, 0x56, 0x28, 0xAA, 0x98, 0x28, 0x6C, 0xA5, 0x5E, 0x60, + 0x08, 0x63, 0xC3, 0x54, 0x3D, 0x64, 0xBA, 0x19, 0xAF, 0x6B, 0x38, 0xEF, 0xF7, 0x0E, 0xAC, 0x18, + 0x81, 0xB0, 0x3E, 0x0F, 0xEF, 0x31, 0xA5, 0xDB, 0xE3, 0x7B, 0x9F, 0xE0, 0x6D, 0xA7, 0x0D, 0xCA, + 0x5F, 0xBC, 0x30, 0xF5, 0x81, 0xC3, 0x33, 0xAD, 0x4B, 0x27, 0x6B, 0x11, 0xB1, 0x4D, 0x0A, 0x1E, + 0xE7, 0x1C, 0xB6, 0x2D, 0xD6, 0x82, 0x75, 0x94, 0x32, 0x49, 0xCC, 0x69, 0x6B, 0x31, 0xAF, 0x52, + 0xE2, 0x58, 0x93, 0x17, 0x11, 0xE7, 0x9F, 0x50, 0x62, 0xB4, 0x92, 0xEF, 0x58, 0xBE, 0x9B, 0x80, + 0xB6, 0x27, 0xB4, 0xBF, 0x53, 0x42, 0xD2, 0x88, 0x22, 0xAC, 0x73, 0x28, 0x29, 0xB1, 0xC6, 0xD0, + 0x57, 0xCA, 0x03, 0x82, 0x5D, 0x07, 0x8F, 0xD0, 0x88, 0x2D, 0x4F, 0xEE, 0x9D, 0xA2, 0x6E, 0x14, + 0x4E, 0x48, 0xAC, 0x75, 0x29, 0x91, 0x16, 0x4F, 0x08, 0x59, 0x0C, 0x84, 0xBF, 0x7C, 0xF2, 0xC0, + 0x5D, 0x3A, 0xD7, 0xD7, 0x3A, 0xE3, 0xC4, 0xE5, 0xDC, 0xF7, 0x93, 0x9F, 0x00, 0x30, 0x6F, 0xFE, + 0xAA, 0xB6, 0x34, 0x77, 0x3E, 0x7D, 0x88, 0x83, 0x73, 0xE1, 0x92, 0x5A, 0x23, 0xBA, 0x64, 0xA6, + 0x16, 0xD2, 0x0A, 0x63, 0x9C, 0x92, 0x08, 0x27, 0x3B, 0x09, 0xB0, 0x3D, 0xA7, 0x5A, 0x63, 0xA9, + 0xB5, 0x62, 0x8A, 0x19, 0x85, 0x7B, 0x95, 0xC5, 0xBF, 0xB3, 0x86, 0x9C, 0x88, 0x79, 0xE3, 0xCA, + 0x32, 0x2B, 0x2A, 0x39, 0x8C, 0xB5, 0xC9, 0xE7, 0x29, 0x01, 0xC7, 0x86, 0x40, 0x5A, 0xFD, 0x09, + 0x41, 0xDE, 0x0F, 0x68, 0xE9, 0x98, 0x50, 0x08, 0x02, 0x25, 0xA9, 0xB7, 0x22, 0xB6, 0x1F, 0x38, + 0x48, 0x23, 0x76, 0x6C, 0xDE, 0x35, 0xC9, 0x44, 0xCD, 0x21, 0xB2, 0x60, 0xB5, 0x49, 0xA2, 0xDB, + 0x81, 0xC1, 0x31, 0x5D, 0x83, 0x5A, 0x5E, 0xBD, 0x3E, 0xEF, 0xAB, 0x0D, 0xDA, 0x8A, 0x07, 0x97, + 0xAE, 0xDF, 0xD4, 0xB9, 0xF7, 0x3C, 0x02, 0x4A, 0xD9, 0xA5, 0x7C, 0xFE, 0xBE, 0x47, 0x30, 0xC6, + 0x9E, 0x36, 0x5B, 0x0F, 0xD7, 0xD4, 0x1A, 0x21, 0x51, 0x6C, 0x91, 0x4E, 0x21, 0x9C, 0x03, 0xE9, + 0xD2, 0xF9, 0xBF, 0xDD, 0xC7, 0x11, 0xCC, 0xD4, 0x05, 0x81, 0x08, 0x5E, 0xD5, 0xE2, 0xC7, 0x59, + 0x43, 0x40, 0xC4, 0xD9, 0xAB, 0x4B, 0xAC, 0xEE, 0xCF, 0x77, 0x80, 0xB5, 0xDD, 0x5F, 0x00, 0xDA, + 0x18, 0x62, 0xAD, 0xF1, 0x3D, 0x6F, 0x1E, 0x78, 0x21, 0x04, 0xCE, 0x19, 0x7C, 0x21, 0xF0, 0x94, + 0x62, 0xA6, 0xD1, 0xE4, 0xC1, 0x67, 0x77, 0xD3, 0x34, 0x8A, 0xC7, 0xF6, 0xCE, 0xF2, 0x52, 0x1D, + 0xBC, 0x6C, 0x19, 0x61, 0x00, 0x6B, 0x8E, 0xA6, 0x37, 0xE7, 0xA8, 0x3A, 0xCB, 0x6C, 0xC3, 0xEF, + 0xAB, 0x54, 0x32, 0xE7, 0xE9, 0x33, 0x56, 0x3E, 0x68, 0x6F, 0x7F, 0x72, 0x71, 0x02, 0x76, 0x1E, + 0xDE, 0xC3, 0xDA, 0xB5, 0x9F, 0xE6, 0x33, 0xDF, 0x7E, 0xD7, 0x59, 0xD5, 0x7A, 0x58, 0x6A, 0x34, + 0x23, 0x34, 0x02, 0x89, 0x43, 0x38, 0x09, 0x52, 0x22, 0x84, 0x9C, 0xD7, 0xE0, 0x98, 0xAE, 0x59, + 0x8A, 0xBE, 0x40, 0xBD, 0x42, 0x26, 0x74, 0xD6, 0xA2, 0x6C, 0xC4, 0xA6, 0x55, 0x45, 0x4E, 0x19, + 0x2E, 0xE2, 0xAC, 0xE5, 0x70, 0xB5, 0xCE, 0xC1, 0xA9, 0x19, 0x96, 0x0F, 0xF6, 0x91, 0xF5, 0x3C, + 0xF6, 0x1F, 0x99, 0x62, 0xC7, 0xD8, 0x21, 0xF2, 0x19, 0x9F, 0xB3, 0xD7, 0xAD, 0x86, 0x2E, 0xF0, + 0x6D, 0x32, 0xA4, 0x94, 0x60, 0x0C, 0xB3, 0xF5, 0x26, 0xFB, 0xA7, 0x1A, 0xEC, 0x98, 0x74, 0x1C, + 0x6A, 0x2A, 0x94, 0x9F, 0xC7, 0x38, 0x0F, 0x8C, 0x65, 0xDE, 0x5A, 0xD4, 0x39, 0x9A, 0x06, 0x66, + 0x1A, 0xA1, 0x18, 0xCA, 0x8B, 0xB3, 0x46, 0x1E, 0xFE, 0x65, 0xBE, 0xB6, 0x6C, 0x6D, 0x63, 0xD1, + 0x24, 0xB8, 0xEB, 0x50, 0x95, 0xDD, 0xBB, 0x3F, 0x9C, 0x0B, 0xC3, 0xF8, 0xB4, 0x6A, 0xAD, 0x45, + 0x2B, 0x8C, 0x3A, 0x09, 0x25, 0x8E, 0x0D, 0x3A, 0xD6, 0xC9, 0xFB, 0x38, 0x11, 0x13, 0x6B, 0xAA, + 0x8D, 0x88, 0xC9, 0x6A, 0x8B, 0x28, 0xD6, 0x84, 0xD1, 0xF1, 0x24, 0x26, 0x6C, 0x35, 0xD8, 0x30, + 0xE4, 0xF3, 0xFA, 0x91, 0x12, 0xCE, 0x59, 0xB4, 0xB5, 0xFC, 0xEC, 0x99, 0xE7, 0xF8, 0x97, 0xFB, + 0x1F, 0xE7, 0xB1, 0x1D, 0xFB, 0x88, 0xB4, 0xE6, 0xBE, 0x67, 0x76, 0x72, 0xFF, 0x73, 0x63, 0x84, + 0x5A, 0xE0, 0x8C, 0xC1, 0xA6, 0x9E, 0x91, 0xE8, 0xA0, 0x3B, 0x7A, 0x5A, 0x6B, 0x29, 0xE7, 0x72, + 0x28, 0x95, 0xE1, 0x70, 0x55, 0x63, 0x45, 0x06, 0xE3, 0x64, 0x92, 0x9C, 0xDB, 0x7A, 0xB6, 0x45, + 0x27, 0x3A, 0xCC, 0xD5, 0x43, 0x42, 0xED, 0x4E, 0xCE, 0x0D, 0xAD, 0xEE, 0x0F, 0xCA, 0x83, 0x8B, + 0x7B, 0xC0, 0xBE, 0x23, 0x75, 0xE6, 0x9A, 0x71, 0xB9, 0xDE, 0x8C, 0x56, 0xD7, 0x9B, 0x11, 0x51, + 0xAC, 0xC1, 0x3A, 0xA4, 0x73, 0x08, 0xA5, 0x40, 0x0A, 0x84, 0xB4, 0x2C, 0x9C, 0x3D, 0x27, 0xE6, + 0x42, 0x3C, 0x01, 0xFE, 0x22, 0xCB, 0x41, 0xE7, 0x1C, 0x56, 0x87, 0x6C, 0x18, 0xF6, 0x39, 0x6F, + 0x55, 0x05, 0x81, 0xC3, 0x68, 0x8B, 0x13, 0x82, 0x6C, 0x90, 0x65, 0xC3, 0xAA, 0x13, 0x58, 0xBD, + 0x64, 0x80, 0x83, 0x33, 0x55, 0x7C, 0x3F, 0xE0, 0xCC, 0xB5, 0x2B, 0x58, 0xD6, 0x57, 0xC6, 0xA4, + 0x6E, 0xEC, 0x52, 0xE0, 0x5E, 0x1A, 0x12, 0x52, 0x0A, 0x0E, 0x4C, 0x4E, 0xF3, 0xC4, 0xCE, 0xFD, + 0xBC, 0xFE, 0x84, 0x11, 0x9E, 0x3A, 0xD0, 0xE0, 0x70, 0x2B, 0x46, 0xFA, 0x92, 0x45, 0xEB, 0xBA, + 0x34, 0xA7, 0xD4, 0x9A, 0x50, 0x6F, 0xC5, 0x4B, 0xAC, 0x63, 0xD4, 0x58, 0xB7, 0x3F, 0xD2, 0x86, + 0xC0, 0x53, 0xF3, 0x09, 0x68, 0x45, 0x31, 0x51, 0x20, 0x07, 0xEA, 0xAD, 0x78, 0xB8, 0xD1, 0x8C, + 0x88, 0x63, 0x8D, 0x74, 0x0E, 0x9B, 0xDE, 0xA8, 0x93, 0x04, 0x17, 0x0C, 0xA4, 0xB5, 0xE1, 0xB0, + 0x70, 0x0C, 0x14, 0x03, 0x04, 0xDD, 0x6D, 0x30, 0x87, 0xD1, 0x11, 0xAB, 0x7A, 0x04, 0x97, 0xAC, + 0xED, 0xC5, 0x17, 0x0E, 0xAD, 0x93, 0xE5, 0xAB, 0x76, 0x50, 0xCC, 0x7A, 0x5C, 0xBC, 0x71, 0x2D, + 0x47, 0xE6, 0x6A, 0xFC, 0x62, 0xEB, 0x6E, 0xCE, 0x5D, 0xB7, 0x92, 0x91, 0x4A, 0x21, 0x99, 0x51, + 0x8C, 0xED, 0xB8, 0xBC, 0x52, 0xAA, 0x13, 0x0A, 0x5B, 0x5F, 0x1C, 0xE3, 0xD1, 0x1D, 0xBB, 0x39, + 0xFF, 0xD4, 0x93, 0x18, 0x1D, 0x2A, 0x53, 0x50, 0x86, 0x28, 0x6C, 0xE1, 0x09, 0x6F, 0x71, 0x02, + 0x70, 0x38, 0xEB, 0x68, 0x86, 0x8E, 0x46, 0x18, 0xE7, 0x6B, 0xAD, 0x68, 0xB4, 0x15, 0xE9, 0x4E, + 0xD2, 0x9E, 0x47, 0x80, 0xB3, 0x0E, 0x9C, 0x1B, 0x6C, 0x85, 0x51, 0x3E, 0x0C, 0x23, 0x74, 0x6C, + 0x69, 0xF3, 0x2A, 0x9C, 0x4A, 0x92, 0xA0, 0x68, 0xCF, 0x02, 0xF3, 0xD3, 0xDE, 0x74, 0xD5, 0x60, + 0x8D, 0xA5, 0x27, 0xE7, 0xA7, 0x39, 0xD2, 0x61, 0x4D, 0xCC, 0x70, 0xCE, 0x72, 0xF9, 0xBA, 0x61, + 0x8A, 0x3E, 0x44, 0x71, 0xDC, 0x89, 0x67, 0x84, 0xC0, 0x13, 0x82, 0xF1, 0xA9, 0x59, 0x1E, 0x7A, + 0x76, 0x37, 0x67, 0x9D, 0x74, 0x02, 0x4B, 0x7A, 0x0A, 0x84, 0x5A, 0x23, 0x21, 0x99, 0xEE, 0x94, + 0x42, 0x4A, 0x89, 0x94, 0x02, 0x63, 0x2D, 0x0F, 0x6C, 0xDD, 0xC1, 0xF6, 0x7D, 0x2F, 0x71, 0xF9, + 0x1B, 0x36, 0xB0, 0x7A, 0xA8, 0x97, 0xF1, 0xD9, 0x1A, 0x47, 0x66, 0xAB, 0x18, 0x53, 0x80, 0xD8, + 0x2C, 0xA2, 0x97, 0xE8, 0x10, 0xD0, 0xC2, 0xD2, 0x0C, 0x75, 0x50, 0x6F, 0xE9, 0xC1, 0xBD, 0x13, + 0xB5, 0xCE, 0xE2, 0x70, 0x1E, 0x01, 0x49, 0xB9, 0xE9, 0x7A, 0x1A, 0xCD, 0xD8, 0x8F, 0xA2, 0x18, + 0x6D, 0xDC, 0xD1, 0xFE, 0xBD, 0x03, 0xA4, 0x4D, 0x93, 0xE0, 0xD1, 0x59, 0xA0, 0x9B, 0xE9, 0xC9, + 0xAA, 0x49, 0xCA, 0xD8, 0xAC, 0x87, 0xB3, 0x9A, 0xA2, 0x8C, 0xB8, 0xFC, 0xA4, 0x41, 0x86, 0xF2, + 0x8A, 0x28, 0xD6, 0x1D, 0xF0, 0xD6, 0x5A, 0x02, 0xDF, 0xA3, 0x11, 0xC5, 0xDC, 0xFD, 0xE8, 0x36, + 0xAE, 0xDA, 0x74, 0x2A, 0xFD, 0xA5, 0x1C, 0x5F, 0xFA, 0xE1, 0x66, 0x7A, 0xF3, 0x19, 0xAE, 0x3D, + 0xF7, 0x74, 0x02, 0xA5, 0x10, 0x29, 0xF8, 0x7A, 0x2B, 0xE2, 0x07, 0x8F, 0x6D, 0xE1, 0xF0, 0x4C, + 0x8D, 0xB7, 0x9D, 0xFB, 0x3A, 0x46, 0xFA, 0xCA, 0xEC, 0x99, 0x98, 0xE5, 0xAB, 0x3F, 0x7D, 0x9A, + 0xF1, 0x19, 0x8D, 0xCC, 0x95, 0x70, 0xC6, 0x1C, 0xA3, 0x4F, 0x32, 0x15, 0x3A, 0x9C, 0xB3, 0xC4, + 0x56, 0xD0, 0x0A, 0x63, 0xA9, 0xB5, 0xE9, 0xFD, 0xFB, 0x3B, 0xB7, 0xF2, 0xD7, 0xD7, 0x9C, 0x7A, + 0x2C, 0x01, 0x61, 0xA4, 0xD1, 0xC6, 0x64, 0xA7, 0xE7, 0x1A, 0xAA, 0x5E, 0x6F, 0xE1, 0x94, 0x4A, + 0x3C, 0xC0, 0x81, 0xB0, 0x0E, 0x94, 0x44, 0x08, 0x97, 0x8E, 0xB3, 0xB8, 0xBB, 0x4D, 0x6A, 0x4D, + 0xA3, 0x29, 0xE8, 0xCD, 0x68, 0x2E, 0xDE, 0xD8, 0xC7, 0xEA, 0xFE, 0x0C, 0xB1, 0x8E, 0x3B, 0xD7, + 0x0B, 0x21, 0xF0, 0x3C, 0x45, 0x23, 0xB6, 0x6C, 0xD9, 0x73, 0x08, 0x27, 0x3D, 0xEA, 0x51, 0xCC, + 0xB6, 0xAD, 0xE3, 0x4C, 0xD7, 0x22, 0x7A, 0x8B, 0x05, 0x3C, 0xCF, 0x47, 0x4A, 0x81, 0x92, 0x92, + 0xC3, 0xB3, 0x55, 0x6E, 0x7F, 0xE0, 0x71, 0x10, 0x8A, 0x3F, 0xB8, 0xF0, 0x0D, 0xF4, 0x17, 0xF3, + 0x3C, 0xB1, 0x73, 0x8C, 0xAF, 0xFD, 0xF4, 0x57, 0xEC, 0x99, 0x15, 0xF8, 0x85, 0x41, 0x9C, 0x93, + 0xA0, 0xCD, 0x22, 0x3A, 0x25, 0x5D, 0x1B, 0xE7, 0x2C, 0x42, 0xC0, 0x6C, 0x3D, 0xA4, 0x15, 0xE9, + 0x7C, 0xF4, 0xF5, 0x2F, 0xE3, 0xBE, 0x7A, 0xFD, 0xB1, 0x04, 0xE0, 0x2C, 0x38, 0x27, 0xC3, 0x48, + 0x73, 0x64, 0xA6, 0x4E, 0xA1, 0x90, 0x21, 0x48, 0xEF, 0x23, 0xAC, 0x43, 0xD8, 0xA4, 0x18, 0x7A, + 0xB9, 0xB6, 0x8F, 0x73, 0x96, 0xA8, 0xDE, 0xE4, 0xE2, 0x0D, 0x15, 0x36, 0xAD, 0x28, 0xA7, 0x45, + 0xCD, 0x51, 0xF0, 0x8D, 0x48, 0xF3, 0xE3, 0x87, 0xB7, 0x70, 0x70, 0xAE, 0xC5, 0x29, 0x2B, 0x47, + 0x58, 0xB3, 0x74, 0x80, 0x6A, 0xA3, 0xC9, 0x8A, 0xC1, 0x5E, 0xCE, 0x3B, 0x65, 0x35, 0xF9, 0xC0, + 0x43, 0x09, 0x90, 0x42, 0xB0, 0x63, 0xEC, 0x10, 0xB7, 0xFE, 0xEC, 0x51, 0x46, 0x06, 0xFB, 0xB8, + 0xEE, 0xFC, 0x33, 0x08, 0x3C, 0xC9, 0x77, 0x1F, 0xDE, 0xCA, 0x37, 0x1F, 0x7A, 0x9E, 0x19, 0x93, + 0xC7, 0xCF, 0xF7, 0x63, 0x44, 0x90, 0xEC, 0xA7, 0x61, 0x8E, 0xA7, 0x10, 0xCE, 0x5A, 0xEA, 0xA1, + 0xA6, 0x9A, 0xF7, 0xB0, 0xCE, 0x49, 0xD8, 0xDF, 0x89, 0x14, 0x6F, 0xE1, 0xC5, 0x02, 0x17, 0x49, + 0x9C, 0x0D, 0xC3, 0x88, 0x56, 0x6C, 0xE8, 0xED, 0x15, 0xF8, 0x90, 0x14, 0x42, 0x4E, 0x21, 0xE4, + 0xCB, 0xF4, 0xBD, 0x9C, 0xC5, 0xC4, 0x2D, 0xCE, 0x5D, 0x99, 0xE3, 0x9A, 0xD7, 0x2D, 0x45, 0x89, + 0x24, 0x61, 0x4A, 0x29, 0x13, 0xCB, 0x2B, 0xC5, 0x0B, 0x2F, 0x1D, 0xE1, 0xAE, 0x47, 0xB6, 0x93, + 0x2F, 0xF4, 0xF0, 0xEE, 0x8B, 0xCF, 0x66, 0x49, 0xC9, 0xC7, 0x51, 0x42, 0x2A, 0xD5, 0xF1, 0x5A, + 0x21, 0x24, 0x9B, 0xB7, 0xEE, 0xE0, 0xB6, 0x5F, 0x3C, 0xCE, 0xB9, 0xA7, 0x9E, 0xC4, 0x35, 0x6F, + 0x3C, 0x8D, 0xD9, 0x7A, 0x93, 0xAF, 0xFC, 0xE8, 0x49, 0xEE, 0xDD, 0x32, 0x86, 0x0E, 0xFA, 0xF0, + 0xB2, 0x3D, 0x18, 0x82, 0x14, 0xF7, 0xE2, 0xE0, 0x93, 0x54, 0xE4, 0xA8, 0x37, 0x23, 0xC2, 0x30, + 0x06, 0x5B, 0x40, 0x38, 0x17, 0x52, 0xBE, 0x36, 0x8D, 0xE9, 0x85, 0x04, 0xE0, 0x10, 0x82, 0x9A, + 0x12, 0x4E, 0x0B, 0x2C, 0xCD, 0x96, 0x66, 0x7A, 0x56, 0x50, 0x2E, 0x83, 0x9F, 0xF1, 0x93, 0x30, + 0x90, 0xB2, 0xD3, 0xA9, 0x59, 0xF8, 0x5B, 0x1D, 0x87, 0x9C, 0x3C, 0xA8, 0xF8, 0xE3, 0xF3, 0x57, + 0xD1, 0x5B, 0xCC, 0x62, 0xEC, 0xD1, 0x84, 0x24, 0x84, 0xC0, 0x5A, 0xCB, 0xCA, 0xE1, 0x01, 0xDE, + 0x79, 0xE1, 0x26, 0xF2, 0xF9, 0x1C, 0x7D, 0x85, 0x00, 0xEB, 0x1C, 0x52, 0x29, 0x84, 0x48, 0xE2, + 0x3D, 0xD2, 0x86, 0x6F, 0xDF, 0xFF, 0x4B, 0xEE, 0x7D, 0x62, 0x3B, 0xEF, 0xBA, 0xF4, 0x8D, 0x5C, + 0xF6, 0xFA, 0x93, 0xD9, 0xBA, 0x67, 0x9C, 0x2F, 0xFF, 0xF0, 0x31, 0x9E, 0x19, 0xAF, 0xA3, 0x72, + 0x03, 0x48, 0xBF, 0x84, 0xC1, 0x7B, 0x79, 0xCB, 0xA7, 0xE0, 0x9B, 0xA1, 0xA6, 0xDA, 0x08, 0xC9, + 0x28, 0xF0, 0xA4, 0x73, 0x52, 0x30, 0x77, 0xD5, 0x47, 0x2E, 0x46, 0xA4, 0x5E, 0x79, 0x8C, 0x07, + 0x38, 0xEB, 0x26, 0x03, 0x4F, 0x46, 0xCA, 0x39, 0x30, 0x9A, 0x30, 0x0C, 0x99, 0xAD, 0x42, 0xC1, + 0xE6, 0x08, 0x32, 0x3E, 0x42, 0x2A, 0x90, 0xB6, 0x8B, 0xE3, 0x24, 0x49, 0x58, 0x1D, 0x33, 0x98, + 0x33, 0xFC, 0xE9, 0xC5, 0xEB, 0x58, 0x31, 0x58, 0x46, 0x1B, 0x8B, 0x27, 0xE7, 0x13, 0x04, 0x82, + 0xA2, 0xE7, 0x71, 0xED, 0x79, 0x1B, 0xD3, 0x69, 0x2D, 0xB1, 0xB6, 0x10, 0x49, 0xBC, 0x4F, 0x57, + 0xEB, 0x7C, 0xE9, 0xCE, 0x9F, 0xF0, 0xFC, 0xFE, 0x43, 0xFC, 0xC5, 0x75, 0x57, 0xB0, 0x71, 0xF5, + 0x08, 0x77, 0x3F, 0xBC, 0x95, 0xFF, 0xFD, 0x93, 0xA7, 0x38, 0xD4, 0xF4, 0xF1, 0xF3, 0x43, 0x38, + 0x2F, 0x8F, 0x71, 0x32, 0xA9, 0xF8, 0xDC, 0xC2, 0x9A, 0x24, 0x19, 0x43, 0x08, 0xB0, 0xD6, 0xD1, + 0x8C, 0x74, 0xB2, 0x96, 0x31, 0x06, 0x25, 0x15, 0x81, 0x14, 0x71, 0xA0, 0xC4, 0x91, 0x37, 0x9D, + 0xBA, 0x94, 0xB6, 0x0D, 0xE7, 0x11, 0x90, 0xF1, 0x15, 0xD9, 0x40, 0x4D, 0xE4, 0x33, 0x6A, 0xCA, + 0x97, 0x0C, 0x38, 0xA3, 0x41, 0x0B, 0xE2, 0x50, 0x50, 0x75, 0x90, 0x33, 0x96, 0x20, 0xE3, 0x27, + 0xE5, 0x68, 0x57, 0x18, 0x58, 0x6B, 0xC8, 0x8A, 0x16, 0x7F, 0xF2, 0xA6, 0xF5, 0xBC, 0x61, 0xF5, + 0x10, 0xC6, 0x3A, 0x3C, 0x71, 0x14, 0xBD, 0x58, 0x10, 0x32, 0xF3, 0xE6, 0x76, 0x40, 0x29, 0xC5, + 0xCE, 0x03, 0x07, 0xF9, 0xEC, 0xAD, 0xF7, 0x20, 0xA4, 0xC7, 0x27, 0xDE, 0xF7, 0x4E, 0x0A, 0x19, + 0x9F, 0xCF, 0xDE, 0xFE, 0x33, 0xBE, 0xF7, 0xD8, 0x6E, 0x22, 0x59, 0xC6, 0xCB, 0x55, 0x30, 0x22, + 0x9B, 0xD4, 0xFA, 0x2F, 0x63, 0x75, 0x00, 0xE3, 0x1C, 0xAD, 0xC8, 0x10, 0xC7, 0x1A, 0x67, 0x1D, + 0xCE, 0x1A, 0x3C, 0x5F, 0x90, 0xF3, 0x65, 0xAB, 0xB7, 0x10, 0x8C, 0x6B, 0x63, 0x16, 0xAF, 0x03, + 0x86, 0x2B, 0x39, 0x56, 0x0E, 0xF7, 0xCC, 0x94, 0x72, 0xC1, 0xBE, 0x8C, 0x2F, 0x4F, 0x12, 0x46, + 0xE3, 0x84, 0xC0, 0x49, 0x81, 0x89, 0x05, 0x0D, 0xE7, 0x88, 0x8D, 0x21, 0x13, 0xF8, 0x48, 0x25, + 0x93, 0xA2, 0xC7, 0x59, 0x9C, 0x6E, 0xF2, 0xCE, 0x37, 0xAD, 0xE2, 0xF7, 0x36, 0xAD, 0x4A, 0x00, + 0x09, 0xD7, 0x01, 0xBD, 0x10, 0x7C, 0x1B, 0x78, 0xFB, 0x3B, 0x01, 0x6C, 0x7E, 0xE6, 0x59, 0x3E, + 0xFF, 0xED, 0x1F, 0xB2, 0x61, 0xCD, 0x4A, 0xDE, 0x7F, 0xED, 0x9B, 0xD9, 0x77, 0x68, 0x92, 0xBF, + 0xF9, 0xFA, 0x0F, 0x79, 0x62, 0xCF, 0x0C, 0x32, 0xDB, 0x87, 0x0C, 0x4A, 0x18, 0xFC, 0xE3, 0xBA, + 0x7C, 0x77, 0x43, 0x39, 0x36, 0x96, 0x58, 0x1B, 0xAC, 0x4D, 0x57, 0x95, 0xD6, 0x82, 0x31, 0x64, + 0x94, 0x4F, 0x39, 0xE7, 0xCF, 0x64, 0x7C, 0x6F, 0x6F, 0xE0, 0x29, 0x02, 0x4F, 0x1D, 0x4B, 0xC0, + 0x89, 0xCB, 0x7A, 0xD9, 0x74, 0xE2, 0x50, 0xF5, 0x8E, 0x9F, 0xFB, 0xCF, 0x16, 0x73, 0xFE, 0x65, + 0xC2, 0x59, 0xAC, 0x8E, 0x71, 0x32, 0x5D, 0x8D, 0x09, 0x88, 0xA3, 0xA4, 0x5E, 0xF0, 0x3C, 0x85, + 0xE7, 0x49, 0x4C, 0xDC, 0xE2, 0x8A, 0x8D, 0x43, 0xFC, 0xC9, 0x65, 0x1B, 0x08, 0x3C, 0x0F, 0xEB, + 0xE6, 0x83, 0x6F, 0x2F, 0x6D, 0x93, 0x82, 0xE6, 0xA8, 0x57, 0x48, 0x29, 0x89, 0xA2, 0x98, 0xDB, + 0xEE, 0xDB, 0xCC, 0x37, 0x7E, 0xFC, 0x20, 0xD7, 0x5D, 0xFC, 0x46, 0xAE, 0xBD, 0xF8, 0x2C, 0x7E, + 0xF4, 0xE8, 0x36, 0xBE, 0xF8, 0xBD, 0x87, 0x19, 0xAB, 0x82, 0x9F, 0x1B, 0xC4, 0x79, 0x79, 0x2C, + 0xAA, 0x03, 0xFE, 0x38, 0x5D, 0x73, 0xAC, 0x75, 0xC4, 0xC6, 0xA6, 0x79, 0xC7, 0xB5, 0xC3, 0x39, + 0x69, 0xA8, 0x58, 0x4B, 0x7F, 0x31, 0xA0, 0x9C, 0x95, 0x2F, 0xCE, 0x4E, 0x8C, 0x1F, 0x6E, 0x36, + 0x8F, 0x92, 0x38, 0x8F, 0x80, 0x4D, 0x27, 0x0E, 0xF1, 0xC7, 0xFF, 0xE3, 0xFB, 0x76, 0xDD, 0x8A, + 0xFE, 0xC7, 0x2B, 0xC5, 0x6C, 0xE4, 0x09, 0x02, 0xA3, 0x35, 0x4E, 0x26, 0xE0, 0x3B, 0x2E, 0xEF, + 0x1C, 0x91, 0xB5, 0xB4, 0x9A, 0x11, 0xA7, 0x8D, 0x16, 0xF9, 0xD0, 0x3B, 0x36, 0xD1, 0x5B, 0xCC, + 0x26, 0x71, 0xDF, 0x65, 0xF1, 0x76, 0x29, 0xDB, 0x9E, 0x05, 0x3A, 0x5E, 0x20, 0x25, 0xD3, 0xB3, + 0x73, 0x7C, 0xF1, 0xB6, 0xEF, 0xF3, 0xD0, 0x96, 0x17, 0xF8, 0x8B, 0xEB, 0xDF, 0xCA, 0xC6, 0x35, + 0xA3, 0xFC, 0xCF, 0x6F, 0xDD, 0xC7, 0xB7, 0x1F, 0x7C, 0x8E, 0x96, 0x28, 0xE2, 0x65, 0x2B, 0x58, + 0x99, 0x41, 0x58, 0x12, 0x2B, 0x2E, 0x38, 0x5C, 0x97, 0x2E, 0xD6, 0xBA, 0xA3, 0xC0, 0xA1, 0x33, + 0xF7, 0x63, 0x2D, 0xCE, 0x18, 0xF2, 0x81, 0x62, 0xA4, 0xBF, 0x40, 0x3E, 0x90, 0x4F, 0x7E, 0xEB, + 0x3F, 0x9F, 0x3B, 0xBB, 0xE6, 0xDD, 0x9F, 0x5A, 0x9C, 0x80, 0xC3, 0x33, 0x4D, 0x36, 0xAE, 0x1A, + 0x64, 0xA8, 0xAF, 0xF0, 0xC4, 0x40, 0x6F, 0xE1, 0x60, 0x36, 0x50, 0x2B, 0xC2, 0x30, 0xC2, 0xC5, + 0x02, 0x8B, 0x40, 0x72, 0x74, 0x1D, 0x60, 0x75, 0x4C, 0x7F, 0xC1, 0x71, 0xE3, 0x75, 0x67, 0xB2, + 0x7A, 0xA8, 0x27, 0xA9, 0xF1, 0x3B, 0xEB, 0xF6, 0xF9, 0x56, 0x5F, 0x08, 0x7E, 0xF7, 0x81, 0x71, + 0x3E, 0xFD, 0xF5, 0x3B, 0x98, 0x6D, 0x84, 0x7C, 0xF2, 0xCF, 0xDE, 0x4D, 0x6C, 0x1C, 0x1F, 0xFA, + 0xC7, 0x3B, 0xF8, 0xE5, 0x8E, 0x09, 0x44, 0xB6, 0x17, 0x15, 0x94, 0x92, 0x29, 0xCE, 0x42, 0xFA, + 0xE7, 0x18, 0xF4, 0x36, 0x2D, 0x71, 0xAD, 0x5B, 0xE4, 0xCB, 0xB6, 0xF5, 0x8D, 0xC1, 0x17, 0x8E, + 0x25, 0x3D, 0x39, 0xFA, 0x8B, 0x99, 0x66, 0x5F, 0xB9, 0xF8, 0xD0, 0x45, 0xFF, 0xF0, 0xA4, 0xDD, + 0xF7, 0xF0, 0x77, 0x17, 0x27, 0x60, 0xB8, 0x37, 0xCF, 0x77, 0x36, 0xEF, 0x60, 0xD3, 0xFA, 0xE5, + 0xBB, 0x1F, 0xDD, 0xBA, 0xFF, 0x91, 0x4A, 0x29, 0xB7, 0x62, 0x6E, 0xAE, 0x8E, 0xD5, 0x71, 0x52, + 0x55, 0x76, 0x7A, 0x0C, 0x86, 0x40, 0x69, 0xFE, 0xFC, 0xAD, 0x67, 0x73, 0xC1, 0xA9, 0xCB, 0x89, + 0xD3, 0x15, 0x5B, 0x27, 0xE6, 0x84, 0x40, 0x76, 0xAD, 0xE1, 0x9D, 0x4B, 0xAA, 0x47, 0x29, 0x04, + 0x8F, 0x3E, 0xB3, 0x9D, 0x4F, 0xFD, 0xEB, 0x77, 0x59, 0xB3, 0x7C, 0x29, 0x1F, 0x7C, 0xCF, 0xDB, + 0xF9, 0xE5, 0xB6, 0x17, 0xF9, 0x5F, 0xDF, 0xD9, 0xCC, 0xFE, 0x19, 0x83, 0x9F, 0x1B, 0x40, 0xB4, + 0x5D, 0x7E, 0xA1, 0xD5, 0xD3, 0xAD, 0x38, 0x97, 0xEE, 0x47, 0x1E, 0xFD, 0x23, 0xBA, 0x92, 0x80, + 0xEB, 0xAC, 0xFE, 0x9C, 0xB1, 0xF8, 0xD2, 0x31, 0x50, 0xCC, 0x30, 0x50, 0xCE, 0xD0, 0x5B, 0xCC, + 0xEC, 0x2A, 0x17, 0x82, 0x47, 0x85, 0x08, 0xF1, 0x8B, 0x95, 0xC5, 0x09, 0x00, 0xB8, 0xE2, 0x0D, + 0xAB, 0xB8, 0xEA, 0xC6, 0x5B, 0x9A, 0x97, 0x9F, 0xB9, 0xE6, 0x9E, 0xE1, 0x81, 0xD2, 0x35, 0x07, + 0x0F, 0x4E, 0x66, 0x9A, 0x51, 0x04, 0xC2, 0x75, 0xDC, 0xCE, 0xC4, 0x96, 0x6B, 0x2E, 0x58, 0xC3, + 0x1F, 0x5E, 0xB2, 0x01, 0x1D, 0xC7, 0xA9, 0x15, 0x5C, 0x7B, 0x12, 0x4A, 0x9E, 0x80, 0xEA, 0x02, + 0xDF, 0xF6, 0x8A, 0x1F, 0x3C, 0xF0, 0x18, 0x37, 0xDF, 0x79, 0x2F, 0x57, 0x5C, 0x70, 0x16, 0x6F, + 0x3A, 0x63, 0x03, 0x37, 0xDD, 0xFD, 0x10, 0xB7, 0xFE, 0x7C, 0x1B, 0x4D, 0x97, 0xC7, 0xCB, 0xF6, + 0x63, 0x65, 0x16, 0x61, 0x45, 0xE2, 0xBA, 0x8B, 0xB9, 0xFC, 0xF1, 0x1E, 0x3A, 0xE8, 0x5E, 0x03, + 0xB9, 0xD4, 0xF2, 0x0A, 0xFA, 0x0B, 0x19, 0xCA, 0x59, 0x45, 0x5F, 0x29, 0x4B, 0x4F, 0x21, 0xF3, + 0x93, 0xF7, 0x5C, 0xBC, 0x7E, 0xEC, 0xB6, 0x5F, 0xEC, 0xE0, 0xCF, 0xFE, 0xDB, 0x87, 0x8E, 0x4F, + 0xC0, 0xBE, 0xC3, 0x73, 0xFC, 0xFE, 0x9B, 0x4E, 0x61, 0xA0, 0x52, 0xB8, 0x6F, 0x74, 0xB8, 0xB2, + 0xED, 0xC5, 0x3D, 0xD9, 0x33, 0x5A, 0x47, 0x5A, 0x10, 0x77, 0x0F, 0x6D, 0x38, 0x30, 0x7E, 0x88, + 0xC3, 0xD3, 0x73, 0x0C, 0x57, 0x0A, 0x49, 0xB3, 0x22, 0xB5, 0xBA, 0x50, 0x2A, 0x59, 0x09, 0x76, + 0x85, 0x41, 0x18, 0xC5, 0xDC, 0x72, 0xCF, 0x7D, 0xFC, 0xE2, 0x89, 0xAD, 0xBC, 0xFF, 0xFA, 0xAB, + 0xC9, 0x64, 0x73, 0xFC, 0xD5, 0x97, 0xEE, 0xE4, 0xE1, 0xE7, 0x0F, 0x23, 0x32, 0x15, 0x54, 0xA6, + 0x88, 0x13, 0xFE, 0xD1, 0xD8, 0x7D, 0xAD, 0x47, 0x1A, 0x07, 0x6D, 0x0F, 0xCC, 0x7A, 0x92, 0xBE, + 0x62, 0x40, 0xCE, 0x13, 0x94, 0x32, 0x1E, 0x83, 0x3D, 0xB9, 0x89, 0x4A, 0x31, 0xFB, 0x9D, 0x4F, + 0x7F, 0xFB, 0x51, 0xF3, 0xF5, 0x9F, 0x1F, 0x9C, 0xF7, 0xD3, 0x63, 0x4A, 0xBA, 0x93, 0x57, 0xF4, + 0xB3, 0x62, 0xB8, 0xC2, 0xBB, 0x2E, 0x39, 0xE5, 0xC0, 0xC8, 0x50, 0xCF, 0xAD, 0x23, 0x4B, 0x7A, + 0x6D, 0xE0, 0x49, 0x9C, 0x8E, 0xB1, 0x71, 0x8C, 0x8B, 0x23, 0x84, 0x73, 0x3C, 0xBC, 0x65, 0x2F, + 0x9F, 0xFC, 0xDA, 0xF7, 0xA9, 0x35, 0x93, 0x56, 0xB5, 0x6B, 0x2B, 0x61, 0x8F, 0x6E, 0x62, 0x00, + 0xCC, 0x56, 0x6B, 0x7C, 0xE1, 0x5F, 0xEF, 0x60, 0xE7, 0xBE, 0x71, 0x3E, 0xFA, 0xBE, 0x7F, 0xC7, + 0xD8, 0x54, 0x9D, 0x0F, 0x7C, 0xEE, 0x76, 0x36, 0x3F, 0x37, 0x89, 0xCC, 0xF6, 0x23, 0xFD, 0x12, + 0x4E, 0x78, 0x09, 0x78, 0x6B, 0xE7, 0x09, 0xAF, 0x20, 0xDD, 0xD7, 0x38, 0x63, 0xC0, 0x18, 0x8A, + 0x81, 0x64, 0xB0, 0x14, 0x90, 0x55, 0xE0, 0x0B, 0x47, 0x7F, 0x4F, 0x8E, 0x81, 0x9E, 0xFC, 0x8F, + 0xD7, 0x2C, 0xEB, 0x7D, 0x6C, 0xB0, 0x27, 0xC7, 0x27, 0xDE, 0xB3, 0x7E, 0x1E, 0xDE, 0x45, 0x9F, + 0x68, 0x78, 0xDB, 0x7B, 0x6E, 0xE0, 0xEC, 0x2B, 0xDF, 0xC3, 0x60, 0x6F, 0x71, 0xAC, 0xD6, 0x08, + 0x2F, 0x9A, 0x98, 0x9C, 0x5D, 0x5A, 0xAF, 0x37, 0xD2, 0x8D, 0xCB, 0xA4, 0x06, 0x12, 0x52, 0xF2, + 0xC2, 0x9E, 0x71, 0xB0, 0x31, 0xE7, 0x9C, 0xB6, 0x16, 0x29, 0x8E, 0xBA, 0xBC, 0x73, 0x16, 0xA5, + 0x14, 0x63, 0x87, 0x27, 0xF9, 0xD2, 0xAD, 0x77, 0xB1, 0x6C, 0x68, 0x80, 0x6B, 0x2F, 0xBF, 0x88, + 0x7F, 0xFE, 0xFE, 0xC3, 0x7C, 0xEE, 0xF6, 0xCD, 0x4C, 0xB5, 0x02, 0xFC, 0x6C, 0x2F, 0x42, 0x65, + 0x93, 0x4D, 0x0C, 0x77, 0x34, 0x7E, 0x5F, 0xB3, 0xA4, 0x44, 0x28, 0x1C, 0xBD, 0x85, 0x80, 0xDE, + 0x82, 0x8F, 0x87, 0x45, 0x3A, 0x43, 0x4F, 0x21, 0x60, 0xF5, 0x48, 0xFF, 0xC4, 0xE8, 0x70, 0xE5, + 0xBF, 0xEE, 0x1A, 0x9B, 0x7A, 0xE1, 0x5D, 0x97, 0xAC, 0xE7, 0x8C, 0x13, 0x97, 0xBD, 0xBC, 0x07, + 0x00, 0xBC, 0xEB, 0xD2, 0x53, 0x39, 0x61, 0x49, 0x85, 0xF7, 0xFF, 0xF9, 0x97, 0xF7, 0xAC, 0x1C, + 0xE9, 0xFF, 0xA7, 0x55, 0xA3, 0x43, 0xAD, 0x5C, 0xC6, 0x07, 0x13, 0xE3, 0x74, 0x84, 0x8B, 0x63, + 0x30, 0x60, 0xC8, 0x72, 0xD3, 0x9D, 0x8F, 0x70, 0xF3, 0x5D, 0x9B, 0x41, 0xC8, 0xD4, 0xF2, 0x1A, + 0x29, 0x24, 0xDB, 0x76, 0xED, 0xE5, 0x96, 0xBB, 0x7F, 0xC2, 0x65, 0xE7, 0x9E, 0xC9, 0xC6, 0x53, + 0x4E, 0xE6, 0x23, 0x9F, 0xBF, 0x9D, 0xAF, 0xFE, 0xE0, 0x57, 0x84, 0xA2, 0x8C, 0x97, 0xE9, 0x01, + 0x19, 0x24, 0xC1, 0xFB, 0x2A, 0xAD, 0x8D, 0x4D, 0x4A, 0x5F, 0xD7, 0x65, 0x7D, 0x67, 0x4C, 0xD2, + 0x66, 0xF7, 0x04, 0xC3, 0x3D, 0x59, 0x2A, 0x39, 0x0F, 0x65, 0x0D, 0xC2, 0x18, 0xB2, 0x9E, 0x60, + 0x49, 0x5F, 0x89, 0xA1, 0x4A, 0xF1, 0xD6, 0xD3, 0x4F, 0x5C, 0xFA, 0xE0, 0xE8, 0x50, 0x99, 0x07, + 0xB6, 0x8C, 0x1D, 0x83, 0xF5, 0xB8, 0xCF, 0xB4, 0x5C, 0xF1, 0xCE, 0xF7, 0x71, 0xE9, 0xA5, 0x1B, + 0x59, 0x39, 0xD2, 0xBF, 0xAB, 0xD6, 0x08, 0xD7, 0xCF, 0xCC, 0xD5, 0x4F, 0x99, 0x9B, 0xAD, 0x61, + 0x8D, 0xE9, 0x2C, 0x71, 0x85, 0x90, 0xC4, 0x16, 0x1E, 0xDF, 0xF6, 0x02, 0xA5, 0xBC, 0xCF, 0xE9, + 0x27, 0xAD, 0x40, 0x08, 0xC1, 0xA3, 0x5B, 0x9F, 0x67, 0xDB, 0xCE, 0x3D, 0x5C, 0x7D, 0xE9, 0x05, + 0x3C, 0xBB, 0x77, 0x82, 0xBF, 0xFE, 0xE2, 0x77, 0xD9, 0xB6, 0x7F, 0x0E, 0x2F, 0xD7, 0x8B, 0xF4, + 0xF2, 0x20, 0xD5, 0xC2, 0xCC, 0xB6, 0xE0, 0x38, 0x4E, 0x93, 0xBD, 0x63, 0xF9, 0x84, 0x80, 0x40, + 0x0A, 0x7A, 0x0B, 0x01, 0x7D, 0xC5, 0x0C, 0x19, 0x05, 0xC2, 0x1A, 0xB0, 0x06, 0x5F, 0x3A, 0x06, + 0x7B, 0x0B, 0xAC, 0x5A, 0x3E, 0xF0, 0xCC, 0x09, 0x4B, 0x7B, 0xFF, 0x6A, 0xEF, 0x4B, 0xD3, 0x87, + 0x8E, 0xCC, 0x35, 0xF8, 0xD3, 0xAB, 0xDF, 0x70, 0xCC, 0x2D, 0x5F, 0xB6, 0x97, 0xED, 0x9C, 0xE3, + 0x23, 0x5F, 0xF8, 0x01, 0xC3, 0xFD, 0xE5, 0x33, 0x1E, 0x7B, 0x66, 0xF7, 0x2D, 0x0F, 0x3F, 0xF1, + 0xDC, 0xBA, 0x89, 0x89, 0x69, 0xAC, 0x13, 0xA0, 0x14, 0x42, 0x79, 0x08, 0x4F, 0x62, 0x6D, 0x4C, + 0xCE, 0x0B, 0xB9, 0xE1, 0xBA, 0xF3, 0x39, 0xF3, 0x94, 0x15, 0xF8, 0x9E, 0x60, 0x74, 0x64, 0x19, + 0x37, 0xDD, 0xFE, 0x33, 0x6E, 0xB9, 0xF7, 0x49, 0x42, 0x0A, 0xA8, 0x6C, 0x19, 0x21, 0x03, 0xE8, + 0xB4, 0xD5, 0x5F, 0xE5, 0x86, 0x62, 0x17, 0x49, 0xED, 0xFA, 0xC2, 0x93, 0x82, 0x62, 0xCE, 0xA7, + 0x9C, 0x0B, 0x08, 0x94, 0x40, 0xB8, 0xC4, 0x3B, 0x84, 0xB5, 0x28, 0x61, 0xA9, 0x14, 0x73, 0xAC, + 0x5D, 0xB9, 0x64, 0x76, 0xDD, 0xCA, 0xA1, 0x1B, 0x3E, 0xFD, 0xAD, 0x27, 0xBF, 0x79, 0xEB, 0xC7, + 0xAF, 0xE2, 0xE0, 0xAC, 0xE6, 0xDA, 0x0B, 0x4F, 0x7E, 0xF5, 0x1E, 0x00, 0xB0, 0xF6, 0xDC, 0x6B, + 0x19, 0x19, 0xAC, 0x70, 0xC3, 0xF5, 0x7F, 0xFB, 0xD2, 0x75, 0xEF, 0xB9, 0x6C, 0x3A, 0x36, 0xF6, + 0x92, 0xE9, 0xE9, 0x6A, 0x36, 0x6C, 0xB6, 0xDA, 0xFD, 0xC3, 0x64, 0xEA, 0x13, 0x8A, 0xD8, 0x08, + 0x1E, 0x79, 0x66, 0x27, 0xE3, 0x47, 0xA6, 0x59, 0x35, 0x3A, 0xC2, 0xA7, 0x6E, 0xBE, 0x9B, 0xEF, + 0x6D, 0x7E, 0x0E, 0xEB, 0xF5, 0x20, 0xFD, 0x22, 0x42, 0xFA, 0xB4, 0x5B, 0x54, 0x9D, 0x95, 0xC8, + 0xAB, 0x88, 0xEF, 0x76, 0x43, 0x03, 0xE7, 0xF0, 0xA4, 0xA0, 0x94, 0xF3, 0x18, 0x28, 0x65, 0x29, + 0x67, 0x3D, 0x3C, 0xE1, 0x10, 0x2E, 0xB1, 0xBA, 0xB0, 0x06, 0xE9, 0x0C, 0xA5, 0x5C, 0xC0, 0x8A, + 0x91, 0x7E, 0xBD, 0x72, 0xD9, 0xC0, 0x67, 0x2F, 0xD9, 0xB4, 0xE6, 0x4B, 0xAF, 0x5B, 0x3B, 0x60, + 0x9A, 0x91, 0xE6, 0xBA, 0x8B, 0x4E, 0x5D, 0x14, 0xE3, 0xCB, 0x12, 0xF0, 0x82, 0x38, 0x95, 0xB7, + 0x9F, 0xBF, 0x9E, 0xF3, 0xAF, 0x3C, 0x9B, 0x2B, 0xCE, 0x3B, 0xF5, 0xB9, 0x83, 0x93, 0x73, 0x26, + 0x36, 0xF6, 0xDC, 0xD9, 0xD9, 0xAA, 0x1F, 0x85, 0x61, 0x92, 0x14, 0xD3, 0x82, 0x45, 0x08, 0x09, + 0xD2, 0x63, 0xFF, 0xA1, 0x59, 0xEE, 0x7D, 0x78, 0x3B, 0x7B, 0x0F, 0xD7, 0xF1, 0x82, 0x12, 0xB2, + 0x93, 0xE8, 0x5C, 0x32, 0x5D, 0x39, 0x9B, 0x36, 0x57, 0xEC, 0xCB, 0x82, 0x4F, 0x4A, 0x59, 0x87, + 0xC4, 0x91, 0xF5, 0x25, 0x3D, 0xF9, 0xC4, 0xD5, 0x4B, 0x59, 0x2F, 0x59, 0x66, 0xBB, 0x04, 0xB4, + 0xE8, 0x80, 0xB7, 0x14, 0xB2, 0x3E, 0xA3, 0xCB, 0xFA, 0xDD, 0xE8, 0xB2, 0xFE, 0x7F, 0x1E, 0xEA, + 0x2F, 0xFF, 0x8D, 0xD1, 0xB6, 0xFE, 0xF4, 0xCE, 0x43, 0x7C, 0xF2, 0x5F, 0x1E, 0x60, 0xE4, 0x8C, + 0xB7, 0x52, 0x5C, 0x77, 0x19, 0xB3, 0xCF, 0xFE, 0xF8, 0xD5, 0x11, 0xD0, 0x73, 0xE5, 0x27, 0x31, + 0xD6, 0x32, 0x35, 0x53, 0xE7, 0xC7, 0x8F, 0xEF, 0xE2, 0xE3, 0xFF, 0xE1, 0x02, 0xBB, 0x7D, 0xFF, + 0xF4, 0x93, 0xBE, 0x92, 0xBE, 0xC5, 0x9D, 0x3D, 0x3B, 0x57, 0xF3, 0xA2, 0x56, 0x88, 0xB3, 0xA6, + 0xCB, 0xAA, 0x02, 0x21, 0x14, 0x0E, 0x0F, 0xA9, 0x32, 0x20, 0xD2, 0x32, 0xA3, 0x03, 0xD6, 0x76, + 0x48, 0xC0, 0x76, 0xC5, 0x73, 0x97, 0xE0, 0x2C, 0x12, 0x4B, 0xA0, 0x24, 0xC5, 0xAC, 0x47, 0x6F, + 0x21, 0xA0, 0x27, 0x1F, 0x90, 0x0B, 0x54, 0x62, 0x71, 0x6B, 0xBB, 0xC0, 0x5B, 0xB0, 0x1A, 0x89, + 0xA3, 0x90, 0xF5, 0x59, 0xBE, 0xB4, 0x8F, 0xE5, 0x4B, 0xFB, 0xEF, 0x40, 0x79, 0x37, 0x7E, 0xF4, + 0x8F, 0x2E, 0x3C, 0xFC, 0xC3, 0x83, 0x23, 0xF2, 0xF1, 0xE7, 0xC7, 0xC8, 0x67, 0x7C, 0x96, 0x0F, + 0x94, 0x78, 0xF1, 0xE0, 0x2C, 0x76, 0xF4, 0x42, 0xEC, 0x9E, 0xFB, 0x5F, 0x3E, 0x07, 0x8C, 0xBC, + 0xFD, 0xBF, 0x13, 0xC6, 0x86, 0xD8, 0x58, 0x02, 0x4F, 0x89, 0x30, 0xD2, 0x38, 0x10, 0xD5, 0x47, + 0x76, 0x8A, 0xF7, 0x7F, 0xFC, 0xBA, 0x12, 0x71, 0xF4, 0xD1, 0x67, 0x77, 0xEC, 0xFB, 0x4F, 0xDB, + 0x9F, 0x7B, 0x31, 0x37, 0x3B, 0x53, 0x4D, 0x16, 0x22, 0x52, 0xA5, 0x9B, 0x27, 0x5D, 0x67, 0xA9, + 0x40, 0x76, 0x6F, 0xA9, 0xB5, 0x5B, 0xEA, 0x47, 0x37, 0x58, 0x45, 0x5A, 0x40, 0x29, 0x25, 0xF1, + 0x3D, 0x45, 0x26, 0x50, 0x64, 0x03, 0x8F, 0xC0, 0x53, 0x28, 0x99, 0x36, 0x4D, 0xD2, 0x90, 0x11, + 0x38, 0x84, 0x73, 0x08, 0x12, 0x42, 0x85, 0xB3, 0x28, 0x01, 0xC5, 0x7C, 0x86, 0x91, 0xA5, 0x03, + 0x6E, 0xC9, 0x70, 0xDF, 0x9D, 0x73, 0x4D, 0x7D, 0xE3, 0x97, 0xBF, 0x76, 0xFF, 0xDE, 0xE2, 0x09, + 0x03, 0x90, 0x2C, 0x24, 0xAC, 0x00, 0x2B, 0xA5, 0x64, 0x76, 0xAE, 0xE1, 0xCE, 0x58, 0xBF, 0x9C, + 0xFE, 0x9E, 0x1C, 0xF7, 0x7E, 0xF6, 0xBD, 0xC7, 0xF7, 0x80, 0x81, 0x8D, 0x57, 0xB2, 0xB4, 0xAF, + 0xC8, 0x4C, 0x2D, 0x14, 0xAD, 0x48, 0x0B, 0x92, 0xE9, 0xD2, 0x0B, 0x46, 0xFA, 0x82, 0xCD, 0xCF, + 0xEC, 0xC5, 0xCF, 0x66, 0x9F, 0x3A, 0x69, 0xC5, 0x60, 0x54, 0x2C, 0x64, 0x4F, 0x0B, 0xC3, 0x28, + 0x17, 0xB6, 0x42, 0x9C, 0xD1, 0x47, 0x2D, 0x6B, 0xDB, 0x96, 0xB2, 0x88, 0xD4, 0xE5, 0x85, 0x4B, + 0xF6, 0x18, 0x14, 0xC9, 0xE3, 0x6C, 0x81, 0x92, 0xE4, 0x03, 0x45, 0x21, 0xA3, 0x28, 0xE5, 0x7C, + 0xCA, 0x39, 0x9F, 0x52, 0xC6, 0x23, 0xEB, 0x2B, 0x7C, 0x49, 0xBA, 0x1F, 0x69, 0x13, 0x4B, 0xBB, + 0x64, 0x5E, 0x17, 0xCE, 0x20, 0xAC, 0xEE, 0xC4, 0x7B, 0x20, 0x05, 0xBD, 0xE5, 0x02, 0xA3, 0xCB, + 0x06, 0xA3, 0x9E, 0x4A, 0xE9, 0xDB, 0x5B, 0xF6, 0x4C, 0xFE, 0xFD, 0x6D, 0x3F, 0x7F, 0xF6, 0x48, + 0x71, 0xA0, 0x94, 0xCE, 0xB1, 0x47, 0x0D, 0x6C, 0xAD, 0x25, 0x97, 0x0B, 0xB8, 0xEA, 0x9C, 0x93, + 0x68, 0x86, 0x9A, 0x0F, 0xDF, 0xF8, 0x5F, 0xB8, 0xEB, 0xFF, 0xDC, 0xB4, 0x88, 0x07, 0x9C, 0xFF, + 0x31, 0x0A, 0xD9, 0x00, 0x29, 0x05, 0xCE, 0x39, 0x91, 0xEA, 0xAC, 0x00, 0x1F, 0xC8, 0x00, 0x39, + 0x6D, 0x6C, 0xA6, 0x98, 0xCF, 0xE4, 0x2F, 0xDA, 0xB8, 0xFC, 0x2A, 0x11, 0x87, 0x37, 0xEC, 0xDD, + 0x3B, 0xBE, 0x6A, 0x7C, 0x7C, 0x82, 0x66, 0xB3, 0x99, 0xF6, 0x03, 0x12, 0xEB, 0x0B, 0x25, 0x91, + 0x4A, 0xCD, 0x93, 0xF6, 0x66, 0x87, 0x52, 0xE9, 0x76, 0x7B, 0xBB, 0x84, 0xEE, 0xB4, 0xC8, 0x44, + 0x47, 0x73, 0x21, 0xDA, 0x0F, 0x45, 0xBA, 0xA4, 0x35, 0x8F, 0x43, 0xE0, 0x50, 0x02, 0xB2, 0xD9, + 0x80, 0x81, 0xBE, 0x1E, 0x06, 0x06, 0x7B, 0xA7, 0x5B, 0x56, 0xDE, 0xF6, 0xC0, 0xD6, 0x03, 0xDF, + 0x7A, 0x69, 0xB2, 0x36, 0xE3, 0x7B, 0x32, 0x22, 0xF9, 0xEF, 0x93, 0x56, 0x7A, 0x0E, 0x81, 0x18, + 0xD0, 0x4A, 0x0A, 0x7B, 0xCE, 0xA9, 0xA3, 0xEE, 0x47, 0x9F, 0xF9, 0xA6, 0xBB, 0xEB, 0xA1, 0xCF, + 0x72, 0xF5, 0xB9, 0x27, 0x2F, 0xE2, 0x01, 0xA3, 0x17, 0x12, 0xCF, 0x35, 0x50, 0x59, 0x5F, 0xC8, + 0x64, 0x1D, 0xAB, 0x80, 0x00, 0xC8, 0x02, 0x45, 0xA0, 0x2C, 0xA5, 0xE8, 0x8D, 0xB5, 0xED, 0xDB, + 0x31, 0x36, 0x3D, 0xE3, 0x67, 0x33, 0x2F, 0xAE, 0x1C, 0x19, 0x2C, 0xF4, 0xF5, 0x14, 0x87, 0x04, + 0x78, 0xCE, 0x18, 0x04, 0x16, 0x25, 0x93, 0xAC, 0xED, 0x49, 0x50, 0x42, 0xA0, 0x64, 0xD2, 0x29, + 0x92, 0x24, 0x22, 0x52, 0x0B, 0xCB, 0xD4, 0xA5, 0x85, 0x33, 0xF3, 0x2C, 0x9E, 0x48, 0x12, 0xE7, + 0xC2, 0x26, 0xF7, 0x94, 0x58, 0xB2, 0xBE, 0x47, 0x6F, 0xA5, 0xC8, 0xB2, 0xA5, 0x03, 0xA6, 0x50, + 0x2E, 0xBD, 0xB0, 0xF3, 0x70, 0xED, 0xF6, 0x9F, 0x3D, 0xBD, 0xEF, 0xF1, 0x5A, 0x33, 0xCA, 0x78, + 0x4A, 0x16, 0x52, 0x23, 0xB5, 0x9F, 0x96, 0x4A, 0xD8, 0x4B, 0x43, 0xC1, 0x5A, 0xE7, 0xC2, 0x48, + 0xBB, 0xBF, 0xFC, 0xE8, 0x3B, 0xF9, 0xE5, 0x96, 0xFD, 0x3C, 0x75, 0xDF, 0xAD, 0xC7, 0x12, 0x50, + 0x38, 0xF9, 0xCD, 0x54, 0x7A, 0x8B, 0x44, 0xDA, 0x08, 0x29, 0x84, 0x24, 0x59, 0x30, 0x05, 0x40, + 0x1E, 0x28, 0x03, 0xBD, 0x40, 0xBF, 0x10, 0x0C, 0x48, 0x21, 0x06, 0x0F, 0x4D, 0x37, 0xBC, 0x03, + 0x53, 0x8D, 0x03, 0x95, 0x9E, 0xE2, 0xDC, 0x8A, 0x65, 0x03, 0xA5, 0x9E, 0x52, 0xBE, 0x20, 0x85, + 0x94, 0xAE, 0xAB, 0x7A, 0x4B, 0x2C, 0x67, 0x3B, 0xC0, 0x65, 0x1A, 0xCB, 0x12, 0xDB, 0x05, 0xD6, + 0xCE, 0x07, 0x9E, 0x82, 0x97, 0x24, 0x44, 0x66, 0x03, 0x9F, 0xDE, 0x9E, 0x22, 0x4B, 0x87, 0xFB, + 0xE9, 0x1B, 0xE8, 0x9D, 0x3E, 0xDC, 0x30, 0x8F, 0x6D, 0x7E, 0xEE, 0xE0, 0x43, 0xBB, 0xC6, 0x67, + 0x66, 0x85, 0xA0, 0x24, 0x84, 0x28, 0xA4, 0x46, 0x0A, 0xBA, 0x42, 0xDB, 0x92, 0xF4, 0xD0, 0x34, + 0x60, 0x85, 0x10, 0xB6, 0x15, 0x6A, 0xFA, 0x4A, 0x39, 0xB7, 0xEB, 0xC0, 0x24, 0xFB, 0x1E, 0xBF, + 0xEB, 0x58, 0x02, 0xD6, 0x5F, 0x70, 0x1D, 0x2B, 0x86, 0x7B, 0x38, 0x3C, 0x5D, 0x97, 0x2E, 0x8D, + 0xFD, 0x94, 0xD5, 0x36, 0x01, 0x15, 0xA0, 0xAF, 0x2D, 0x52, 0x88, 0x5E, 0xAD, 0x6D, 0x79, 0x7C, + 0xAA, 0xD6, 0x3C, 0x52, 0x8B, 0x0F, 0xF6, 0xF4, 0x94, 0x1A, 0xCB, 0x96, 0xF4, 0x65, 0x06, 0x7A, + 0xCB, 0x99, 0x6C, 0x36, 0x90, 0x2A, 0xDD, 0x5D, 0x92, 0x0B, 0xAC, 0xDF, 0x26, 0xA1, 0x9D, 0xD4, + 0xDA, 0x16, 0x4E, 0xBC, 0x24, 0x79, 0x04, 0x37, 0x1B, 0xF8, 0x14, 0x8B, 0x39, 0x06, 0xFA, 0x7A, + 0x18, 0x1E, 0xEE, 0xB7, 0xA5, 0x4A, 0xCF, 0xDC, 0x74, 0xC4, 0xCE, 0x27, 0x76, 0x4F, 0x3E, 0xB3, + 0x6D, 0xEF, 0xE4, 0xC1, 0x30, 0xD2, 0x9E, 0x94, 0x22, 0x9F, 0xEA, 0x17, 0xA4, 0xBA, 0xB6, 0x9F, + 0x59, 0x35, 0xA9, 0xEB, 0x47, 0xED, 0x10, 0x20, 0xE9, 0x9C, 0xB9, 0xB1, 0x23, 0x73, 0xEE, 0xE0, + 0x74, 0x83, 0xE6, 0x0B, 0xF7, 0x1D, 0xBB, 0x1C, 0x56, 0x69, 0x5C, 0x2E, 0xD8, 0x67, 0x6C, 0x27, + 0x42, 0x95, 0x0E, 0xE2, 0xA7, 0x03, 0x06, 0x40, 0x46, 0x08, 0x32, 0x02, 0x91, 0x99, 0xA9, 0x35, + 0x79, 0xF4, 0x85, 0xE6, 0xDE, 0x52, 0x3E, 0x33, 0x31, 0x3A, 0x50, 0x1C, 0x58, 0x32, 0xB4, 0x64, + 0xC9, 0xE0, 0x12, 0xD7, 0x6F, 0xA2, 0xB0, 0xD0, 0x6A, 0xB6, 0xBC, 0x56, 0x2B, 0x24, 0x8A, 0x22, + 0x74, 0x6C, 0xB0, 0xF6, 0x68, 0x67, 0x56, 0x4A, 0x81, 0x54, 0x12, 0xDF, 0xF3, 0x08, 0x02, 0x9F, + 0x4C, 0x26, 0x20, 0x9B, 0xCD, 0x90, 0xCB, 0x65, 0x8D, 0xF4, 0xFD, 0x56, 0xD3, 0x30, 0xB3, 0x6F, + 0xA6, 0x75, 0x68, 0xCF, 0xC4, 0xF4, 0x91, 0xA9, 0xB9, 0x56, 0xDD, 0xE1, 0xAC, 0x14, 0x22, 0x07, + 0x22, 0x4E, 0xC1, 0xB5, 0x5D, 0x3D, 0xEE, 0xD2, 0xCB, 0x4B, 0xF5, 0x95, 0xA9, 0x74, 0xF2, 0x9D, + 0x36, 0x4E, 0xD8, 0x74, 0xBD, 0x7E, 0x0C, 0x01, 0xA6, 0xF3, 0x9C, 0xCE, 0xBC, 0x8F, 0xDB, 0x71, + 0xD4, 0xCD, 0x6A, 0x98, 0x4A, 0x7B, 0x5F, 0xDA, 0x09, 0x21, 0xAC, 0x00, 0xAF, 0xD6, 0x88, 0xEC, + 0xB6, 0xBD, 0x93, 0x8D, 0xE7, 0x95, 0x1C, 0xAB, 0x14, 0x32, 0xB9, 0xC1, 0x9E, 0x5C, 0xB9, 0xBF, + 0x58, 0xAE, 0x94, 0xCB, 0xB2, 0xE4, 0x4B, 0xF2, 0x9E, 0x20, 0x27, 0x70, 0x7E, 0xB2, 0xA9, 0x97, + 0xF4, 0x4B, 0xA4, 0x94, 0x0E, 0x21, 0x63, 0xED, 0x68, 0xC5, 0x96, 0x66, 0x2B, 0xB6, 0xF5, 0xF1, + 0xE9, 0x70, 0xF6, 0xD0, 0xCC, 0xDC, 0xDC, 0x74, 0xAD, 0xD5, 0x88, 0x62, 0xA3, 0x11, 0x38, 0x29, + 0x84, 0x15, 0x49, 0x73, 0xBC, 0xAD, 0x4B, 0x9C, 0xEA, 0xD1, 0xEA, 0xD2, 0xA9, 0x93, 0xF8, 0xDA, + 0xF1, 0xDF, 0x6D, 0xCE, 0xC0, 0x57, 0xAE, 0xFD, 0xF6, 0x18, 0x02, 0x76, 0x8D, 0x4F, 0x93, 0xCF, + 0xD4, 0x88, 0x8D, 0x71, 0x4A, 0xCA, 0x36, 0x70, 0x9D, 0x82, 0x6E, 0x74, 0x25, 0x19, 0xD2, 0x41, + 0x9A, 0x69, 0xEC, 0x65, 0xD3, 0xCF, 0x93, 0xC7, 0x78, 0x84, 0xF0, 0x9C, 0x73, 0x72, 0xAA, 0xDA, + 0x94, 0x47, 0xE6, 0x9A, 0x07, 0x85, 0x40, 0x7A, 0x4A, 0xAA, 0x8C, 0xEF, 0x79, 0xB9, 0x8C, 0xE7, + 0x67, 0x7D, 0x15, 0x28, 0x21, 0x54, 0xBA, 0x45, 0xE3, 0xAC, 0xC5, 0x46, 0xDA, 0xE8, 0x46, 0x18, + 0xC7, 0xAD, 0xC8, 0xC4, 0xDA, 0x58, 0x6B, 0x9D, 0xB3, 0x49, 0x57, 0x5E, 0x38, 0x29, 0x85, 0x65, + 0x7E, 0x4C, 0xEB, 0x2E, 0xBD, 0xDA, 0x04, 0x34, 0x80, 0x2A, 0x30, 0x9B, 0x9E, 0x1B, 0xE9, 0x77, + 0x6D, 0x22, 0x9C, 0xA7, 0x04, 0x6F, 0x39, 0x7B, 0x2D, 0xBB, 0xC7, 0xA6, 0xF8, 0xE9, 0x62, 0x04, + 0xD4, 0x1B, 0x21, 0xF5, 0x23, 0x73, 0xE4, 0xFA, 0x8A, 0xDD, 0x96, 0x6F, 0x03, 0x6D, 0x67, 0x56, + 0x9D, 0xBE, 0xAF, 0x02, 0xB9, 0x14, 0x7C, 0x9B, 0x98, 0xB6, 0x78, 0x80, 0x12, 0x42, 0x28, 0x95, + 0xFC, 0xC3, 0x98, 0xB4, 0xD6, 0xC9, 0x46, 0x2B, 0x16, 0xF5, 0x56, 0x24, 0xE9, 0xD8, 0xE0, 0xA8, + 0x6B, 0x0A, 0x91, 0xB4, 0xD4, 0x84, 0x48, 0xB6, 0x23, 0x94, 0xE8, 0x80, 0xEE, 0x06, 0xDF, 0x4D, + 0x40, 0xDB, 0x1B, 0x23, 0x8E, 0x4E, 0x7B, 0x0D, 0xA0, 0x96, 0xEA, 0x56, 0x4D, 0x3F, 0x8B, 0x01, + 0xE3, 0x9C, 0x73, 0xC3, 0xBD, 0x25, 0xF7, 0xBA, 0x93, 0x96, 0x52, 0xC8, 0x07, 0x8B, 0x13, 0x80, + 0x10, 0xE4, 0xFB, 0x4B, 0x48, 0x21, 0x3A, 0x2D, 0xC0, 0x54, 0xC9, 0xB0, 0x2B, 0xB9, 0x84, 0xE9, + 0x20, 0x6D, 0xCB, 0xB7, 0xE3, 0xAE, 0x1B, 0x7C, 0x3B, 0x06, 0xDB, 0x71, 0xA8, 0x20, 0x9D, 0xF2, + 0x11, 0xB2, 0xB3, 0x39, 0x37, 0x9F, 0x04, 0xD7, 0x75, 0xB6, 0x5D, 0xE7, 0xE3, 0x59, 0x7F, 0x31, + 0x12, 0x42, 0xE6, 0xD7, 0x01, 0xED, 0x24, 0x68, 0x00, 0xE7, 0xFB, 0xCA, 0x7D, 0xE0, 0xBA, 0x73, + 0x78, 0x70, 0xCB, 0x5E, 0x3E, 0xB7, 0x28, 0x01, 0x0F, 0x7E, 0x02, 0xF9, 0xE6, 0x4F, 0x2C, 0x8C, + 0x7F, 0xDD, 0xA5, 0x8C, 0x4E, 0x6F, 0xEE, 0x2F, 0x22, 0x0B, 0x81, 0x77, 0x13, 0xD0, 0x9D, 0x8C, + 0xDA, 0x49, 0xF5, 0x78, 0xC7, 0xF1, 0x08, 0x68, 0x8F, 0x6F, 0xBA, 0xA4, 0x1D, 0xEB, 0x71, 0x97, + 0x44, 0x5D, 0x9F, 0xB5, 0xAF, 0x77, 0x80, 0xDB, 0xB6, 0x65, 0x3F, 0x1B, 0xFE, 0xE8, 0xF3, 0x8C, + 0x4D, 0xCC, 0xC1, 0xA2, 0x04, 0x1C, 0xAB, 0x48, 0xFB, 0xDC, 0x4D, 0x40, 0xDC, 0x65, 0xD5, 0xC5, + 0xC0, 0x76, 0xBF, 0x6E, 0x17, 0x53, 0x62, 0x81, 0xBC, 0x12, 0x01, 0xDD, 0x63, 0x2E, 0x46, 0x84, + 0x59, 0x40, 0x48, 0x77, 0x88, 0x98, 0x45, 0xAE, 0x47, 0x08, 0xE1, 0x0A, 0x03, 0x45, 0x76, 0x8D, + 0x4D, 0x71, 0xFD, 0x25, 0x1B, 0xE7, 0xB9, 0xDE, 0x31, 0x47, 0x71, 0xBE, 0x17, 0x74, 0x5F, 0xDB, + 0x0D, 0xA0, 0xFB, 0xB5, 0x5C, 0xE4, 0xBB, 0xEE, 0xCF, 0xBA, 0x85, 0x45, 0xCE, 0x0B, 0x09, 0x5F, + 0x48, 0xC4, 0x42, 0x42, 0x16, 0x92, 0xB3, 0xF0, 0xBC, 0xF0, 0xF7, 0x9D, 0xA3, 0x76, 0xEF, 0xC7, + 0x8E, 0x01, 0xF5, 0x6A, 0x49, 0x58, 0x4C, 0xF1, 0x85, 0xC4, 0x74, 0xBF, 0x7E, 0x25, 0xC0, 0xAF, + 0x74, 0x1C, 0x8F, 0x90, 0xC5, 0xC8, 0xE1, 0x65, 0xCE, 0x8B, 0x82, 0x07, 0xF8, 0xBF, 0xBC, 0x7A, + 0x38, 0x97, 0x7C, 0xD1, 0xFC, 0xA1, 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, + 0x74, 0x65, 0x3A, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x00, 0x32, 0x30, 0x32, 0x30, 0x2D, 0x30, + 0x33, 0x2D, 0x31, 0x39, 0x54, 0x31, 0x30, 0x3A, 0x35, 0x30, 0x3A, 0x35, 0x38, 0x2B, 0x30, 0x30, + 0x3A, 0x30, 0x30, 0x62, 0x40, 0x28, 0xF1, 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, + 0x61, 0x74, 0x65, 0x3A, 0x6D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x00, 0x32, 0x30, 0x31, 0x39, 0x2D, + 0x30, 0x31, 0x2D, 0x30, 0x38, 0x54, 0x31, 0x35, 0x3A, 0x35, 0x34, 0x3A, 0x32, 0x33, 0x2B, 0x30, + 0x30, 0x3A, 0x30, 0x30, 0x8A, 0xEF, 0xF9, 0x19, 0x00, 0x00, 0x00, 0x20, 0x74, 0x45, 0x58, 0x74, + 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x00, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F, + 0x2F, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x6D, 0x61, 0x67, 0x69, 0x63, 0x6B, 0x2E, 0x6F, 0x72, 0x67, + 0xBC, 0xCF, 0x1D, 0x9D, 0x00, 0x00, 0x00, 0x18, 0x74, 0x45, 0x58, 0x74, 0x54, 0x68, 0x75, 0x6D, + 0x62, 0x3A, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3A, 0x3A, 0x50, 0x61, 0x67, + 0x65, 0x73, 0x00, 0x31, 0xA7, 0xFF, 0xBB, 0x2F, 0x00, 0x00, 0x00, 0x18, 0x74, 0x45, 0x58, 0x74, + 0x54, 0x68, 0x75, 0x6D, 0x62, 0x3A, 0x3A, 0x49, 0x6D, 0x61, 0x67, 0x65, 0x3A, 0x3A, 0x48, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x00, 0x31, 0x32, 0x38, 0x43, 0x7C, 0x41, 0x80, 0x00, 0x00, 0x00, 0x17, + 0x74, 0x45, 0x58, 0x74, 0x54, 0x68, 0x75, 0x6D, 0x62, 0x3A, 0x3A, 0x49, 0x6D, 0x61, 0x67, 0x65, + 0x3A, 0x3A, 0x57, 0x69, 0x64, 0x74, 0x68, 0x00, 0x31, 0x32, 0x38, 0xD0, 0x8D, 0x11, 0xDD, 0x00, + 0x00, 0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x54, 0x68, 0x75, 0x6D, 0x62, 0x3A, 0x3A, 0x4D, 0x69, + 0x6D, 0x65, 0x74, 0x79, 0x70, 0x65, 0x00, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, + 0x3F, 0xB2, 0x56, 0x4E, 0x00, 0x00, 0x00, 0x17, 0x74, 0x45, 0x58, 0x74, 0x54, 0x68, 0x75, 0x6D, + 0x62, 0x3A, 0x3A, 0x4D, 0x54, 0x69, 0x6D, 0x65, 0x00, 0x31, 0x35, 0x34, 0x36, 0x39, 0x36, 0x32, + 0x38, 0x36, 0x33, 0x1F, 0x1E, 0xB3, 0x01, 0x00, 0x00, 0x00, 0x12, 0x74, 0x45, 0x58, 0x74, 0x54, + 0x68, 0x75, 0x6D, 0x62, 0x3A, 0x3A, 0x53, 0x69, 0x7A, 0x65, 0x00, 0x31, 0x39, 0x32, 0x37, 0x34, + 0x42, 0x0A, 0x19, 0xAB, 0x42, 0x00, 0x00, 0x00, 0x56, 0x74, 0x45, 0x58, 0x74, 0x54, 0x68, 0x75, + 0x6D, 0x62, 0x3A, 0x3A, 0x55, 0x52, 0x49, 0x00, 0x66, 0x69, 0x6C, 0x65, 0x3A, 0x2F, 0x2F, 0x2F, + 0x64, 0x61, 0x74, 0x61, 0x2F, 0x77, 0x77, 0x77, 0x72, 0x6F, 0x6F, 0x74, 0x2F, 0x77, 0x77, 0x77, + 0x2E, 0x65, 0x61, 0x73, 0x79, 0x69, 0x63, 0x6F, 0x6E, 0x2E, 0x6E, 0x65, 0x74, 0x2F, 0x63, 0x64, + 0x6E, 0x2D, 0x69, 0x6D, 0x67, 0x2E, 0x65, 0x61, 0x73, 0x79, 0x69, 0x63, 0x6F, 0x6E, 0x2E, 0x63, + 0x6E, 0x2F, 0x66, 0x69, 0x6C, 0x65, 0x73, 0x2F, 0x32, 0x2F, 0x32, 0x39, 0x31, 0x36, 0x35, 0x2E, + 0x70, 0x6E, 0x67, 0xBF, 0x98, 0x5F, 0xE5, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, + 0x42, 0x60, 0x82 +}; + +void *get_window_icon_raw_data(int *len) +{ + *len = (int)sizeof(window_icon_hexData); + return window_icon_hexData; +} + diff --git a/src/gui/QT/main.cpp b/src/gui/QT/main.cpp new file mode 100644 index 0000000..dc2f917 --- /dev/null +++ b/src/gui/QT/main.cpp @@ -0,0 +1,467 @@ +#include "hiperiso2diskwindow.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern "C" { +#include "hiperiso_define.h" +#include "hiperiso_util.h" +#include "hiperiso_qt.h" +} + +using namespace std; + +char g_log_file[4096]; +char g_ini_file[4096]; + +/* + * Hiperiso2Disk global stylesheet. + * + * This is a self-contained copy of hiperiso.qss so the binary needs no + * external file at runtime. Keep this in sync with src/gui/QT/hiperiso.qss. + * Brand accent: #2d8e57 (green). + */ +static const char *g_hiperiso_qss = R"CSS( +QWidget { + color: #1f2933; +} + +QMainWindow { + background-color: #eef1f5; +} + +QGroupBox { + background-color: #ffffff; + border: 1px solid #d4d7dd; + border-radius: 6px; + margin-top: 14px; + padding: 14px 10px 10px 10px; + font-weight: bold; + color: #2d8e57; +} + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top left; + left: 12px; + padding: 0 6px; + background-color: #ffffff; + color: #2d8e57; + font-weight: bold; +} + +QComboBox { + background-color: #ffffff; + border: 1px solid #c4c9d2; + border-radius: 4px; + padding: 4px 28px 4px 10px; + min-height: 22px; + color: #1f2933; + selection-background-color: #2d8e57; + selection-color: #ffffff; +} + +QComboBox:hover { + border: 1px solid #2d8e57; +} + +QComboBox::drop-down { + subcontrol-origin: padding; + subcontrol-position: top right; + width: 24px; + border-left: 1px solid #d4d7dd; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + background-color: #f5f6f8; +} + +QComboBox::drop-down:hover { + background-color: #e6efe9; +} + +QComboBox QAbstractItemView { + border: 1px solid #c4c9d2; + border-radius: 4px; + background-color: #ffffff; + selection-background-color: #2d8e57; + selection-color: #ffffff; + outline: none; + padding: 4px; +} + +QProgressBar { + background-color: #e6e9ee; + border: 1px solid #c4c9d2; + border-radius: 4px; + text-align: center; + color: #ffffff; + font-weight: bold; + min-height: 22px; +} + +QProgressBar::chunk { + background-color: #2d8e57; + border-radius: 3px; +} + +QLabel { + color: #1f2933; +} + +QGroupBox QLabel { + background: transparent; +} + +QPushButton { + background-color: #ffffff; + border: 1px solid #c4c9d2; + border-radius: 4px; + padding: 6px 16px; + color: #1f2933; + min-height: 20px; +} + +QPushButton:hover { + background-color: #f0f3f6; + border: 1px solid #2d8e57; + color: #2d8e57; +} + +QPushButton:pressed { + background-color: #e3e8ed; +} + +QPushButton:disabled { + color: #a0a6b0; + background-color: #f2f4f7; + border: 1px solid #dde0e6; +} + +QPushButton#ButtonInstall, +QPushButton#ButtonUpdate { + background-color: #2d8e57; + border: 1px solid #256e44; + color: #ffffff; + font-weight: 600; +} + +QPushButton#ButtonInstall:hover, +QPushButton#ButtonUpdate:hover { + background-color: #329f66; + border: 1px solid #256e44; + color: #ffffff; +} + +QPushButton#ButtonInstall:pressed, +QPushButton#ButtonUpdate:pressed { + background-color: #256e44; + color: #ffffff; +} + +QPushButton#ButtonInstall:disabled, +QPushButton#ButtonUpdate:disabled { + background-color: #a9cdb8; + border: 1px solid #94bda3; + color: #f2f7f4; +} + +QPushButton#ButtonRefresh { + background-color: #ffffff; + border: 1px solid #c4c9d2; + border-radius: 4px; +} + +QPushButton#ButtonRefresh:hover { + background-color: #e6efe9; + border: 1px solid #2d8e57; +} + +QPushButton#ButtonRefresh:pressed { + background-color: #d2e4d9; +} + +QMenuBar { + background-color: #ffffff; + color: #1f2933; + border-bottom: 1px solid #d4d7dd; + padding: 2px; +} + +QMenuBar::item { + background-color: transparent; + padding: 6px 12px; + border-radius: 3px; +} + +QMenuBar::item:selected { + background-color: #e6efe9; + color: #2d8e57; +} + +QMenu { + background-color: #ffffff; + border: 1px solid #d4d7dd; + border-radius: 4px; + padding: 4px; +} + +QMenu::item { + padding: 6px 24px; + border-radius: 3px; +} + +QMenu::item:selected { + background-color: #2d8e57; + color: #ffffff; +} + +QMenu::separator { + height: 1px; + background: #e3e6eb; + margin: 4px 8px; +} + +QScrollBar:vertical { + background: #eef1f5; + width: 10px; + border: none; +} + +QScrollBar::handle:vertical { + background: #c4c9d2; + border-radius: 4px; + min-height: 24px; +} + +QScrollBar::handle:vertical:hover { + background: #2d8e57; +} + +QScrollBar::add-line:vertical, +QScrollBar::sub-line:vertical { + height: 0px; +} + +QScrollBar::add-page:vertical, +QScrollBar::sub-page:vertical { + background: none; +} + +QToolTip { + background-color: #1f2933; + color: #ffffff; + border: 1px solid #1f2933; + border-radius: 3px; + padding: 4px 8px; +} + +/* ---- Dialog (PartCfg etc.) ---- */ +QDialog { + background-color: #f5f6f8; +} + +QGroupBox { + background-color: #ffffff; + border: 1px solid #d4d7dd; + border-radius: 6px; + margin-top: 14px; + padding: 14px 10px 10px 10px; + font-weight: bold; + color: #2d8e57; +} + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top left; + left: 12px; + padding: 0 6px; + background-color: #ffffff; + color: #2d8e57; +} + +/* ---- Radio buttons & checkboxes ---- */ +QRadioButton { + spacing: 6px; + color: #1f2933; +} +QRadioButton::indicator { + width: 16px; + height: 16px; + border-radius: 8px; + border: 2px solid #c4c9d2; + background: #ffffff; +} +QRadioButton::indicator:hover { + border: 2px solid #2d8e57; +} +QRadioButton::indicator:checked { + border: 2px solid #2d8e57; + background: qradialgradient(cx:0.5, cy:0.5, radius:0.5, + fx:0.5, fy:0.5, + stop:0 #2d8e57, stop:0.5 #2d8e57, + stop:0.6 transparent, stop:1 transparent); +} + +QCheckBox { + spacing: 6px; + color: #1f2933; +} +QCheckBox::indicator { + width: 16px; + height: 16px; + border-radius: 3px; + border: 2px solid #c4c9d2; + background: #ffffff; +} +QCheckBox::indicator:hover { + border: 2px solid #2d8e57; +} +QCheckBox::indicator:checked { + border: 2px solid #2d8e57; + background: #2d8e57; + image: none; +} + +/* ---- Line edits & spin boxes ---- */ +QLineEdit, QSpinBox { + background-color: #ffffff; + border: 1px solid #c4c9d2; + border-radius: 4px; + padding: 4px 8px; + color: #1f2933; + selection-background-color: #2d8e57; + selection-color: #ffffff; +} +QLineEdit:focus, QSpinBox:focus { + border: 1px solid #2d8e57; +} +QSpinBox::up-button, QSpinBox::down-button { + background: #eef1f5; + border: none; + width: 18px; +} +QSpinBox::up-button:hover, QSpinBox::down-button:hover { + background: #d2e4d9; +} + +/* ---- Dialog buttons ---- */ +QDialogButtonBox QPushButton { + min-width: 72px; +} +)CSS"; + +static bool hiso_adjust_cur_dir(const QString &startDir) +{ + QDir dir(startDir); + + for (int i = 0; i < 6; i++) + { + if (QFileInfo::exists(dir.filePath("boot/boot.img"))) + { + return QDir::setCurrent(dir.absolutePath()); + } + + if (!dir.cdUp()) + { + break; + } + } + + return false; +} + +int main(int argc, char *argv[]) +{ + int ret; + long long size; + QApplication a(argc, argv); + a.setStyleSheet(QString::fromUtf8(g_hiperiso_qss)); + Hiperiso2DiskWindow w; + +#ifdef QT_CHECK_EUID + if (geteuid() != 0) + { + QMessageBox::critical(&w, "Error", "Permission denied!\nPlease run with root privileges."); + return 1; + } +#endif + + if (!QFileInfo::exists("./boot/boot.img")) + { + hiso_adjust_cur_dir(a.applicationDirPath()); + } + + if (!QFileInfo::exists("./boot/boot.img")) + { + QMessageBox::critical(&w, "Error", "Please run under the correct directory."); + return 1; + } + + hiperiso_log_init(); + + snprintf(g_log_file, sizeof(g_log_file), "./log.txt"); + snprintf(g_ini_file, sizeof(g_ini_file), "./Hiperiso2Disk.ini"); + for (int i = 0; i < argc; i++) + { + if (argv[i] && argv[i + 1] && strcmp(argv[i], "-l") == 0) + { + snprintf(g_log_file, sizeof(g_log_file), "%s", argv[i + 1]); + } + else if (argv[i] && argv[i + 1] && strcmp(argv[i], "-i") == 0) + { + snprintf(g_ini_file, sizeof(g_ini_file), "%s", argv[i + 1]); + } + } + + QFileInfo Info(g_log_file); + size = (long long)Info.size(); + if (size >= 4 * SIZE_1MB) + { + QFile::remove(g_log_file); + } + + vlog("===================================================\n"); + vlog("===== Hiperiso2Disk %s powered by QT %s =====\n", hiperiso_get_local_version(), qVersion()); + vlog("===================================================\n"); + vlog("log file is <%s> lastsize:%lld\n", g_log_file, (long long)size); + vlog("ini file is <%s>\n", g_ini_file); + + hiperiso_disk_init(); + hiperiso_http_init(); + + w.setGeometry(QStyle::alignedRect(Qt::LeftToRight, + Qt::AlignCenter, + w.size(), + a.desktop()->availableGeometry())); + + QPixmap pix; + QIcon icon; + int len; + const uchar *data; + + data = (const uchar *)get_window_icon_raw_data(&len); + pix.loadFromData(data, len); + icon.addPixmap(pix); + w.setWindowIcon(icon); + + w.show(); + + ret = a.exec(); + + hiperiso_disk_exit(); + hiperiso_http_exit(); + + vlog("######## Hiperiso2Disk QT %s exit ########\n", hiperiso_get_local_version()); + + /* log exit must at the end */ + hiperiso_log_exit(); + + return ret; +} diff --git a/src/gui/QT/moc_hiperiso2diskwindow.cpp b/src/gui/QT/moc_hiperiso2diskwindow.cpp new file mode 100644 index 0000000..a823f50 --- /dev/null +++ b/src/gui/QT/moc_hiperiso2diskwindow.cpp @@ -0,0 +1,312 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'hiperiso2diskwindow.h' +** +** Created by: The Qt Meta Object Compiler version 67 (Qt 5.15.19) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include +#include "hiperiso2diskwindow.h" +#include +#include +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'hiperiso2diskwindow.h' doesn't include ." +#elif Q_MOC_OUTPUT_REVISION != 67 +#error "This file was generated using the moc from 5.15.19. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +QT_WARNING_PUSH +QT_WARNING_DISABLE_DEPRECATED +struct qt_meta_stringdata_MyQThread_t { + QByteArrayData data[5]; + char stringdata0[33]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_MyQThread_t, stringdata0) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_MyQThread_t qt_meta_stringdata_MyQThread = { + { +QT_MOC_LITERAL(0, 0, 9), // "MyQThread" +QT_MOC_LITERAL(1, 10, 12), // "thread_event" +QT_MOC_LITERAL(2, 23, 0), // "" +QT_MOC_LITERAL(3, 24, 3), // "msg" +QT_MOC_LITERAL(4, 28, 4) // "data" + + }, + "MyQThread\0thread_event\0\0msg\0data" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_MyQThread[] = { + + // content: + 8, // revision + 0, // classname + 0, 0, // classinfo + 1, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 1, // signalCount + + // signals: name, argc, parameters, tag, flags + 1, 2, 19, 2, 0x06 /* Public */, + + // signals: parameters + QMetaType::Void, QMetaType::Int, QMetaType::Int, 3, 4, + + 0 // eod +}; + +void MyQThread::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + auto *_t = static_cast(_o); + (void)_t; + switch (_id) { + case 0: _t->thread_event((*reinterpret_cast< int(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2]))); break; + default: ; + } + } else if (_c == QMetaObject::IndexOfMethod) { + int *result = reinterpret_cast(_a[0]); + { + using _t = void (MyQThread::*)(int , int ); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&MyQThread::thread_event)) { + *result = 0; + return; + } + } + } +} + +QT_INIT_METAOBJECT const QMetaObject MyQThread::staticMetaObject = { { + QMetaObject::SuperData::link(), + qt_meta_stringdata_MyQThread.data, + qt_meta_data_MyQThread, + qt_static_metacall, + nullptr, + nullptr +} }; + + +const QMetaObject *MyQThread::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *MyQThread::qt_metacast(const char *_clname) +{ + if (!_clname) return nullptr; + if (!strcmp(_clname, qt_meta_stringdata_MyQThread.stringdata0)) + return static_cast(this); + return QThread::qt_metacast(_clname); +} + +int MyQThread::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QThread::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 1) + qt_static_metacall(this, _c, _id, _a); + _id -= 1; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 1) + *reinterpret_cast(_a[0]) = -1; + _id -= 1; + } + return _id; +} + +// SIGNAL 0 +void MyQThread::thread_event(int _t1, int _t2) +{ + void *_a[] = { nullptr, const_cast(reinterpret_cast(std::addressof(_t1))), const_cast(reinterpret_cast(std::addressof(_t2))) }; + QMetaObject::activate(this, &staticMetaObject, 0, _a); +} +struct qt_meta_stringdata_Hiperiso2DiskWindow_t { + QByteArrayData data[21]; + char stringdata0[439]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_Hiperiso2DiskWindow_t, stringdata0) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_Hiperiso2DiskWindow_t qt_meta_stringdata_Hiperiso2DiskWindow = { + { +QT_MOC_LITERAL(0, 0, 19), // "Hiperiso2DiskWindow" +QT_MOC_LITERAL(1, 20, 12), // "thread_event" +QT_MOC_LITERAL(2, 33, 0), // "" +QT_MOC_LITERAL(3, 34, 3), // "msg" +QT_MOC_LITERAL(4, 38, 4), // "data" +QT_MOC_LITERAL(5, 43, 23), // "part_style_check_action" +QT_MOC_LITERAL(6, 67, 8), // "QAction*" +QT_MOC_LITERAL(7, 76, 3), // "act" +QT_MOC_LITERAL(8, 80, 17), // "lang_check_action" +QT_MOC_LITERAL(9, 98, 24), // "on_ButtonInstall_clicked" +QT_MOC_LITERAL(10, 123, 23), // "on_ButtonUpdate_clicked" +QT_MOC_LITERAL(11, 147, 24), // "on_ButtonRefresh_clicked" +QT_MOC_LITERAL(12, 172, 37), // "on_comboBoxDevice_currentInde..." +QT_MOC_LITERAL(13, 210, 5), // "index" +QT_MOC_LITERAL(14, 216, 42), // "on_actionPartition_Configurat..." +QT_MOC_LITERAL(15, 259, 33), // "on_actionClear_Hiperiso_trigg..." +QT_MOC_LITERAL(16, 293, 33), // "on_actionShow_All_Devices_tog..." +QT_MOC_LITERAL(17, 327, 4), // "arg1" +QT_MOC_LITERAL(18, 332, 38), // "on_actionSecure_Boot_Support_..." +QT_MOC_LITERAL(19, 371, 42), // "on_actionInstall_Non_Destruct..." +QT_MOC_LITERAL(20, 414, 24) // "on_actionAbout_triggered" + + }, + "Hiperiso2DiskWindow\0thread_event\0\0msg\0" + "data\0part_style_check_action\0QAction*\0" + "act\0lang_check_action\0on_ButtonInstall_clicked\0" + "on_ButtonUpdate_clicked\0" + "on_ButtonRefresh_clicked\0" + "on_comboBoxDevice_currentIndexChanged\0" + "index\0on_actionPartition_Configuration_triggered\0" + "on_actionClear_Hiperiso_triggered\0" + "on_actionShow_All_Devices_toggled\0" + "arg1\0on_actionSecure_Boot_Support_triggered\0" + "on_actionInstall_Non_Destructive_triggered\0" + "on_actionAbout_triggered" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_Hiperiso2DiskWindow[] = { + + // content: + 8, // revision + 0, // classname + 0, 0, // classinfo + 13, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 0, // signalCount + + // slots: name, argc, parameters, tag, flags + 1, 2, 79, 2, 0x08 /* Private */, + 5, 1, 84, 2, 0x08 /* Private */, + 8, 1, 87, 2, 0x08 /* Private */, + 9, 0, 90, 2, 0x08 /* Private */, + 10, 0, 91, 2, 0x08 /* Private */, + 11, 0, 92, 2, 0x08 /* Private */, + 12, 1, 93, 2, 0x08 /* Private */, + 14, 0, 96, 2, 0x08 /* Private */, + 15, 0, 97, 2, 0x08 /* Private */, + 16, 1, 98, 2, 0x08 /* Private */, + 18, 0, 101, 2, 0x08 /* Private */, + 19, 0, 102, 2, 0x08 /* Private */, + 20, 0, 103, 2, 0x08 /* Private */, + + // slots: parameters + QMetaType::Void, QMetaType::Int, QMetaType::Int, 3, 4, + QMetaType::Void, 0x80000000 | 6, 7, + QMetaType::Void, 0x80000000 | 6, 7, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, QMetaType::Int, 13, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, QMetaType::Bool, 17, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + + 0 // eod +}; + +void Hiperiso2DiskWindow::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + auto *_t = static_cast(_o); + (void)_t; + switch (_id) { + case 0: _t->thread_event((*reinterpret_cast< int(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2]))); break; + case 1: _t->part_style_check_action((*reinterpret_cast< QAction*(*)>(_a[1]))); break; + case 2: _t->lang_check_action((*reinterpret_cast< QAction*(*)>(_a[1]))); break; + case 3: _t->on_ButtonInstall_clicked(); break; + case 4: _t->on_ButtonUpdate_clicked(); break; + case 5: _t->on_ButtonRefresh_clicked(); break; + case 6: _t->on_comboBoxDevice_currentIndexChanged((*reinterpret_cast< int(*)>(_a[1]))); break; + case 7: _t->on_actionPartition_Configuration_triggered(); break; + case 8: _t->on_actionClear_Hiperiso_triggered(); break; + case 9: _t->on_actionShow_All_Devices_toggled((*reinterpret_cast< bool(*)>(_a[1]))); break; + case 10: _t->on_actionSecure_Boot_Support_triggered(); break; + case 11: _t->on_actionInstall_Non_Destructive_triggered(); break; + case 12: _t->on_actionAbout_triggered(); break; + default: ; + } + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + switch (_id) { + default: *reinterpret_cast(_a[0]) = -1; break; + case 1: + switch (*reinterpret_cast(_a[1])) { + default: *reinterpret_cast(_a[0]) = -1; break; + case 0: + *reinterpret_cast(_a[0]) = qRegisterMetaType< QAction* >(); break; + } + break; + case 2: + switch (*reinterpret_cast(_a[1])) { + default: *reinterpret_cast(_a[0]) = -1; break; + case 0: + *reinterpret_cast(_a[0]) = qRegisterMetaType< QAction* >(); break; + } + break; + } + } +} + +QT_INIT_METAOBJECT const QMetaObject Hiperiso2DiskWindow::staticMetaObject = { { + QMetaObject::SuperData::link(), + qt_meta_stringdata_Hiperiso2DiskWindow.data, + qt_meta_data_Hiperiso2DiskWindow, + qt_static_metacall, + nullptr, + nullptr +} }; + + +const QMetaObject *Hiperiso2DiskWindow::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *Hiperiso2DiskWindow::qt_metacast(const char *_clname) +{ + if (!_clname) return nullptr; + if (!strcmp(_clname, qt_meta_stringdata_Hiperiso2DiskWindow.stringdata0)) + return static_cast(this); + return QMainWindow::qt_metacast(_clname); +} + +int Hiperiso2DiskWindow::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QMainWindow::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 13) + qt_static_metacall(this, _c, _id, _a); + _id -= 13; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 13) + qt_static_metacall(this, _c, _id, _a); + _id -= 13; + } + return _id; +} +QT_WARNING_POP +QT_END_MOC_NAMESPACE diff --git a/src/gui/QT/moc_partcfgdialog.cpp b/src/gui/QT/moc_partcfgdialog.cpp new file mode 100644 index 0000000..1f6386b --- /dev/null +++ b/src/gui/QT/moc_partcfgdialog.cpp @@ -0,0 +1,129 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'partcfgdialog.h' +** +** Created by: The Qt Meta Object Compiler version 67 (Qt 5.15.19) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include +#include "partcfgdialog.h" +#include +#include +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'partcfgdialog.h' doesn't include ." +#elif Q_MOC_OUTPUT_REVISION != 67 +#error "This file was generated using the moc from 5.15.19. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +QT_WARNING_PUSH +QT_WARNING_DISABLE_DEPRECATED +struct qt_meta_stringdata_PartCfgDialog_t { + QByteArrayData data[6]; + char stringdata0[97]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_PartCfgDialog_t, stringdata0) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_PartCfgDialog_t qt_meta_stringdata_PartCfgDialog = { + { +QT_MOC_LITERAL(0, 0, 13), // "PartCfgDialog" +QT_MOC_LITERAL(1, 14, 23), // "on_pushButtonOK_clicked" +QT_MOC_LITERAL(2, 38, 0), // "" +QT_MOC_LITERAL(3, 39, 27), // "on_pushButtonCancel_clicked" +QT_MOC_LITERAL(4, 67, 24), // "on_checkBox_stateChanged" +QT_MOC_LITERAL(5, 92, 4) // "arg1" + + }, + "PartCfgDialog\0on_pushButtonOK_clicked\0" + "\0on_pushButtonCancel_clicked\0" + "on_checkBox_stateChanged\0arg1" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_PartCfgDialog[] = { + + // content: + 8, // revision + 0, // classname + 0, 0, // classinfo + 3, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 0, // signalCount + + // slots: name, argc, parameters, tag, flags + 1, 0, 29, 2, 0x08 /* Private */, + 3, 0, 30, 2, 0x08 /* Private */, + 4, 1, 31, 2, 0x08 /* Private */, + + // slots: parameters + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, QMetaType::Int, 5, + + 0 // eod +}; + +void PartCfgDialog::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + auto *_t = static_cast(_o); + (void)_t; + switch (_id) { + case 0: _t->on_pushButtonOK_clicked(); break; + case 1: _t->on_pushButtonCancel_clicked(); break; + case 2: _t->on_checkBox_stateChanged((*reinterpret_cast< int(*)>(_a[1]))); break; + default: ; + } + } +} + +QT_INIT_METAOBJECT const QMetaObject PartCfgDialog::staticMetaObject = { { + QMetaObject::SuperData::link(), + qt_meta_stringdata_PartCfgDialog.data, + qt_meta_data_PartCfgDialog, + qt_static_metacall, + nullptr, + nullptr +} }; + + +const QMetaObject *PartCfgDialog::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *PartCfgDialog::qt_metacast(const char *_clname) +{ + if (!_clname) return nullptr; + if (!strcmp(_clname, qt_meta_stringdata_PartCfgDialog.stringdata0)) + return static_cast(this); + return QDialog::qt_metacast(_clname); +} + +int PartCfgDialog::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QDialog::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 3) + qt_static_metacall(this, _c, _id, _a); + _id -= 3; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 3) + *reinterpret_cast(_a[0]) = -1; + _id -= 3; + } + return _id; +} +QT_WARNING_POP +QT_END_MOC_NAMESPACE diff --git a/src/gui/QT/moc_predefs.h b/src/gui/QT/moc_predefs.h new file mode 100644 index 0000000..b38b876 --- /dev/null +++ b/src/gui/QT/moc_predefs.h @@ -0,0 +1,446 @@ +#define __DBL_MIN_EXP__ (-1021) +#define __LDBL_MANT_DIG__ 64 +#define __UINT_LEAST16_MAX__ 0xffff +#define __FLT16_HAS_QUIET_NAN__ 1 +#define __ATOMIC_ACQUIRE 2 +#define __FLT128_MAX_10_EXP__ 4932 +#define __FLT_MIN__ 1.17549435082228750796873653722224568e-38F +#define __GCC_IEC_559_COMPLEX 2 +#define __UINT_LEAST8_TYPE__ unsigned char +#define __SIZEOF_FLOAT80__ 16 +#define __BFLT16_DENORM_MIN__ 9.18354961579912115600575419704879436e-41BF16 +#define __INTMAX_C(c) c ## L +#define __CHAR_BIT__ 8 +#define __UINT8_MAX__ 0xff +#define __SCHAR_WIDTH__ 8 +#define __WINT_MAX__ 0xffffffffU +#define __FLT32_MIN_EXP__ (-125) +#define __cpp_static_assert 200410L +#define __BFLT16_MIN_10_EXP__ (-37) +#define __cpp_inheriting_constructors 201511L +#define __ORDER_LITTLE_ENDIAN__ 1234 +#define __WCHAR_MAX__ 0x7fffffff +#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1 +#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1 +#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1 +#define __GCC_ATOMIC_CHAR_LOCK_FREE 2 +#define __GCC_IEC_559 2 +#define __FLT32X_DECIMAL_DIG__ 17 +#define __FLT_EVAL_METHOD__ 0 +#define __cpp_binary_literals 201304L +#define __FLT64_DECIMAL_DIG__ 17 +#define __GCC_ATOMIC_CHAR32_T_LOCK_FREE 2 +#define __cpp_variadic_templates 200704L +#define __UINT_FAST64_MAX__ 0xffffffffffffffffUL +#define __SIG_ATOMIC_TYPE__ int +#define __DBL_MIN_10_EXP__ (-307) +#define __FINITE_MATH_ONLY__ 0 +#define __FLT32X_MAX_EXP__ 1024 +#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1 +#define __FLT32_HAS_DENORM__ 1 +#define __UINT_FAST8_MAX__ 0xff +#define __cpp_rvalue_reference 200610L +#define __FLT32_MAX_10_EXP__ 38 +#define __DEC64_MAX_EXP__ 385 +#define __INT8_C(c) c +#define __LDBL_HAS_INFINITY__ 1 +#define __INT_LEAST8_WIDTH__ 8 +#define __UINT_LEAST64_MAX__ 0xffffffffffffffffUL +#define __INT_LEAST8_MAX__ 0x7f +#define __cpp_attributes 200809L +#define __SHRT_MAX__ 0x7fff +#define __LDBL_MAX__ 1.18973149535723176502126385303097021e+4932L +#define __FLT64X_MAX_10_EXP__ 4932 +#define __BFLT16_MAX_10_EXP__ 38 +#define __BFLT16_MAX_EXP__ 128 +#define __LDBL_IS_IEC_60559__ 1 +#define __FLT64X_HAS_QUIET_NAN__ 1 +#define __UINT_LEAST8_MAX__ 0xff +#define __GCC_ATOMIC_BOOL_LOCK_FREE 2 +#define __FLT128_DENORM_MIN__ 6.47517511943802511092443895822764655e-4966F128 +#define __UINTMAX_TYPE__ long unsigned int +#define __cpp_nsdmi 200809L +#define __BFLT16_DECIMAL_DIG__ 4 +#define __linux 1 +#define __DEC32_EPSILON__ 1E-6DF +#define __FLT_EVAL_METHOD_TS_18661_3__ 0 +#define __OPTIMIZE__ 1 +#define __UINT32_MAX__ 0xffffffffU +#define __GXX_EXPERIMENTAL_CXX0X__ 1 +#define __DBL_DENORM_MIN__ double(4.94065645841246544176568792868221372e-324L) +#define __FLT128_MIN_EXP__ (-16381) +#define __DEC64X_MAX_EXP__ 6145 +#define __WINT_MIN__ 0U +#define __FLT128_MIN_10_EXP__ (-4931) +#define __FLT32X_IS_IEC_60559__ 1 +#define __INT_LEAST16_WIDTH__ 16 +#define __SCHAR_MAX__ 0x7f +#define __FLT128_MANT_DIG__ 113 +#define __WCHAR_MIN__ (-__WCHAR_MAX__ - 1) +#define __INT64_C(c) c ## L +#define __SSP_STRONG__ 3 +#define __GCC_ATOMIC_POINTER_LOCK_FREE 2 +#define __ATOMIC_SEQ_CST 5 +#define __unix 1 +#define __INT_LEAST64_MAX__ 0x7fffffffffffffffL +#define __FLT32X_MANT_DIG__ 53 +#define __GCC_ATOMIC_CHAR16_T_LOCK_FREE 2 +#define __FLT64X_EPSILON__ 1.08420217248550443400745280086994171e-19F64x +#define __STDC_HOSTED__ 1 +#define __DEC64_MIN_EXP__ (-382) +#define __DBL_DIG__ 15 +#define __STDC_EMBED_EMPTY__ 2 +#define __FLT_EPSILON__ 1.19209289550781250000000000000000000e-7F +#define __GXX_WEAK__ 1 +#define __SHRT_WIDTH__ 16 +#define __FLT32_IS_IEC_60559__ 1 +#define __LDBL_MIN__ 3.36210314311209350626267781732175260e-4932L +#define __DBL_IS_IEC_60559__ 1 +#define __DEC32_MAX__ 9.999999E96DF +#define __cpp_threadsafe_static_init 200806L +#define __FLT64X_DENORM_MIN__ 3.64519953188247460252840593361941982e-4951F64x +#define __FLT32X_HAS_INFINITY__ 1 +#define __unix__ 1 +#define __INT_WIDTH__ 32 +#define __STDC_IEC_559__ 1 +#define __STDC_ISO_10646__ 201706L +#define __DECIMAL_DIG__ 21 +#define __STDC_IEC_559_COMPLEX__ 1 +#define __gnu_linux__ 1 +#define __INT16_MAX__ 0x7fff +#define __FLT64_MIN_EXP__ (-1021) +#define __DEC64X_EPSILON__ 1E-33D64x +#define __FLT64X_MIN_10_EXP__ (-4931) +#define __LDBL_HAS_QUIET_NAN__ 1 +#define __FLT16_MIN_EXP__ (-13) +#define __FLT64_MANT_DIG__ 53 +#define __FLT64X_MANT_DIG__ 64 +#define __BFLT16_DIG__ 2 +#define __GNUC__ 16 +#define __GXX_RTTI 1 +#define __pie__ 2 +#define __MMX__ 1 +#define __FLT_HAS_DENORM__ 1 +#define __SIZEOF_LONG_DOUBLE__ 16 +#define __BIGGEST_ALIGNMENT__ 16 +#define __STDC_UTF_16__ 1 +#define __FLT64_MAX_10_EXP__ 308 +#define __BFLT16_IS_IEC_60559__ 0 +#define __FLT16_MAX_10_EXP__ 4 +#define __cpp_delegating_constructors 200604L +#define __DBL_MAX__ double(1.79769313486231570814527423731704357e+308L) +#define __cpp_raw_strings 200710L +#define __INT_FAST32_MAX__ 0x7fffffffffffffffL +#define __DBL_HAS_INFINITY__ 1 +#define __INT64_MAX__ 0x7fffffffffffffffL +#define __SIZEOF_FLOAT__ 4 +#define __HAVE_SPECULATION_SAFE_VALUE 1 +#define __DEC32_MIN_EXP__ (-94) +#define __INTPTR_WIDTH__ 64 +#define __UINT_LEAST32_MAX__ 0xffffffffU +#define __FLT32X_HAS_DENORM__ 1 +#define __INT_FAST16_TYPE__ long int +#define __MMX_WITH_SSE__ 1 +#define __LDBL_HAS_DENORM__ 1 +#define __SEG_GS 1 +#define __BFLT16_EPSILON__ 7.81250000000000000000000000000000000e-3BF16 +#define __cplusplus 201103L +#define __cpp_ref_qualifiers 200710L +#define __DEC32_MIN__ 1E-95DF +#define __DEPRECATED 1 +#define __cpp_rvalue_references 200610L +#define __DBL_MAX_EXP__ 1024 +#define __WCHAR_WIDTH__ 32 +#define __FLT32_MAX__ 3.40282346638528859811704183484516925e+38F32 +#define __DEC128_EPSILON__ 1E-33DL +#define __FLT16_DECIMAL_DIG__ 5 +#define __SSE2_MATH__ 1 +#define __ATOMIC_HLE_RELEASE 131072 +#define __PTRDIFF_MAX__ 0x7fffffffffffffffL +#define __amd64 1 +#define __DEC64X_MAX__ 9.999999999999999999999999999999999E6144D64x +#define __ATOMIC_HLE_ACQUIRE 65536 +#define __GNUG__ 16 +#define __LONG_LONG_MAX__ 0x7fffffffffffffffLL +#define __SIZEOF_SIZE_T__ 8 +#define __BFLT16_HAS_INFINITY__ 1 +#define __FLT64X_MIN_EXP__ (-16381) +#define __SIZEOF_WINT_T__ 4 +#define __FLT32X_DIG__ 15 +#define __LONG_LONG_WIDTH__ 64 +#define __cpp_initializer_lists 200806L +#define __FLT32_MAX_EXP__ 128 +#define __cpp_hex_float 201603L +#define __GXX_ABI_VERSION 1021 +#define __FLT_MIN_EXP__ (-125) +#define __GCC_HAVE_DWARF2_CFI_ASM 1 +#define __x86_64 1 +#define __cpp_lambdas 200907L +#define __INT_FAST64_TYPE__ long int +#define __BFLT16_MAX__ 3.38953138925153547590470800371487867e+38BF16 +#define __FLT64_DENORM_MIN__ 4.94065645841246544176568792868221372e-324F64 +#define __FLT16_DENORM_MIN__ 5.96046447753906250000000000000000000e-8F16 +#define __FLT128_EPSILON__ 1.92592994438723585305597794258492732e-34F128 +#define __FLT64X_NORM_MAX__ 1.18973149535723176502126385303097021e+4932F64x +#define __SIZEOF_POINTER__ 8 +#define __SIZE_TYPE__ long unsigned int +#define __LP64__ 1 +#define __DBL_HAS_QUIET_NAN__ 1 +#define __FLT32X_EPSILON__ 2.22044604925031308084726333618164062e-16F32x +#define __LDBL_MAX_EXP__ 16384 +#define __DECIMAL_BID_FORMAT__ 1 +#define __FLT64_MIN_10_EXP__ (-307) +#define __FLT16_MIN_10_EXP__ (-4) +#define __FLT64X_DECIMAL_DIG__ 21 +#define __DEC128_MIN__ 1E-6143DL +#define __REGISTER_PREFIX__ +#define __UINT16_MAX__ 0xffff +#define __FLT128_HAS_INFINITY__ 1 +#define __FLT32_MIN__ 1.17549435082228750796873653722224568e-38F32 +#define __UINT8_TYPE__ unsigned char +#define __FLT_DIG__ 6 +#define __DEC_EVAL_METHOD__ 2 +#define __FLT_MANT_DIG__ 24 +#define __LDBL_DECIMAL_DIG__ 21 +#define __VERSION__ "16.1.1 20260430" +#define __UINT64_C(c) c ## UL +#define __cpp_unicode_characters 200704L +#define __DEC64X_MIN__ 1E-6143D64x +#define _STDC_PREDEF_H 1 +#define __INT_LEAST32_MAX__ 0x7fffffff +#define __GCC_ATOMIC_INT_LOCK_FREE 2 +#define __FLT128_MAX_EXP__ 16384 +#define __FLT32_MANT_DIG__ 24 +#define __cpp_decltype 200707L +#define __FLOAT_WORD_ORDER__ __ORDER_LITTLE_ENDIAN__ +#define __FLT32X_MIN_EXP__ (-1021) +#define __STDC_IEC_60559_COMPLEX__ 201404L +#define __BFLT16_MIN__ 1.17549435082228750796873653722224568e-38BF16 +#define __FLT128_HAS_DENORM__ 1 +#define __FLT32_DECIMAL_DIG__ 9 +#define __FLT128_DIG__ 33 +#define __INT32_C(c) c +#define __DEC64_EPSILON__ 1E-15DD +#define __ORDER_PDP_ENDIAN__ 3412 +#define __DEC128_MIN_EXP__ (-6142) +#define __DEC128_MAX__ 9.999999999999999999999999999999999E6144DL +#define __INT_FAST32_TYPE__ long int +#define __UINT_LEAST16_TYPE__ short unsigned int +#define __DEC64X_MANT_DIG__ 34 +#define __DEC128_MAX_EXP__ 6145 +#define unix 1 +#define __DBL_HAS_DENORM__ 1 +#define __cpp_rtti 199711L +#define __UINT64_MAX__ 0xffffffffffffffffUL +#define __FLT_IS_IEC_60559__ 1 +#define __GNUC_WIDE_EXECUTION_CHARSET_NAME "UTF-32LE" +#define __FLT64X_DIG__ 18 +#define __INT8_TYPE__ signed char +#define __ELF__ 1 +#define __GCC_ASM_FLAG_OUTPUTS__ 1 +#define __UINT32_TYPE__ unsigned int +#define __BFLT16_HAS_QUIET_NAN__ 1 +#define __FLT_RADIX__ 2 +#define __INT_LEAST16_TYPE__ short int +#define __LDBL_EPSILON__ 1.08420217248550443400745280086994171e-19L +#define __UINTMAX_C(c) c ## UL +#define __FLT16_DIG__ 3 +#define __k8 1 +#define __FLT32X_MIN__ 2.22507385850720138309023271733240406e-308F32x +#define __SIG_ATOMIC_MAX__ 0x7fffffff +#define __cpp_constexpr 200704L +#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2 +#define __USER_LABEL_PREFIX__ +#define __STDC_IEC_60559_BFP__ 201404L +#define __SIZEOF_PTRDIFF_T__ 8 +#define __FLT64X_HAS_INFINITY__ 1 +#define __SIZEOF_LONG__ 8 +#define __LDBL_DIG__ 18 +#define __FLT64_IS_IEC_60559__ 1 +#define __x86_64__ 1 +#define __FLT16_IS_IEC_60559__ 1 +#define __FLT16_MAX_EXP__ 16 +#define __DEC32_SUBNORMAL_MIN__ 0.000001E-95DF +#define __STDC_EMBED_FOUND__ 1 +#define __INT_FAST16_MAX__ 0x7fffffffffffffffL +#define __GCC_CONSTRUCTIVE_SIZE 64 +#define __FLT64_DIG__ 15 +#define __UINT_FAST32_MAX__ 0xffffffffffffffffUL +#define __UINT_LEAST64_TYPE__ long unsigned int +#define __FLT16_EPSILON__ 9.76562500000000000000000000000000000e-4F16 +#define __FLT_HAS_QUIET_NAN__ 1 +#define __FLT_MAX_10_EXP__ 38 +#define __FLT64X_HAS_DENORM__ 1 +#define __DEC128_SUBNORMAL_MIN__ 0.000000000000000000000000000000001E-6143DL +#define __FLT_HAS_INFINITY__ 1 +#define __GNUC_EXECUTION_CHARSET_NAME "UTF-8" +#define __cpp_unicode_literals 200710L +#define __UINT_FAST16_TYPE__ long unsigned int +#define __DEC64_MAX__ 9.999999999999999E384DD +#define __STDC_EMBED_NOT_FOUND__ 0 +#define __INT_FAST32_WIDTH__ 64 +#define __CHAR16_TYPE__ short unsigned int +#define __PRAGMA_REDEFINE_EXTNAME 1 +#define __DEC64X_SUBNORMAL_MIN__ 0.000000000000000000000000000000001E-6143D64x +#define __SIZE_WIDTH__ 64 +#define __SEG_FS 1 +#define __INT_LEAST16_MAX__ 0x7fff +#define __FLT16_NORM_MAX__ 6.55040000000000000000000000000000000e+4F16 +#define __DEC64_MANT_DIG__ 16 +#define __FLT32_DENORM_MIN__ 1.40129846432481707092372958328991613e-45F32 +#define __SIG_ATOMIC_WIDTH__ 32 +#define __INT_LEAST64_TYPE__ long int +#define __INT16_TYPE__ short int +#define __INT_LEAST8_TYPE__ signed char +#define __FLT16_MAX__ 6.55040000000000000000000000000000000e+4F16 +#define __FLT128_MIN__ 3.36210314311209350626267781732175260e-4932F128 +#define __SIZEOF_INT__ 4 +#define __DEC32_MAX_EXP__ 97 +#define __INT_FAST8_MAX__ 0x7f +#define __FLT128_MAX__ 1.18973149535723176508575932662800702e+4932F128 +#define __INTPTR_MAX__ 0x7fffffffffffffffL +#define linux 1 +#define __FLT64_HAS_QUIET_NAN__ 1 +#define __FLT32_MIN_10_EXP__ (-37) +#define __EXCEPTIONS 1 +#define __UINT16_C(c) c +#define __PTRDIFF_WIDTH__ 64 +#define __cpp_range_based_for 200907L +#define __INT_FAST16_WIDTH__ 64 +#define __FLT64_HAS_INFINITY__ 1 +#define __FLT64X_MAX__ 1.18973149535723176502126385303097021e+4932F64x +#define __FLT16_HAS_INFINITY__ 1 +#define __SIG_ATOMIC_MIN__ (-__SIG_ATOMIC_MAX__ - 1) +#define __code_model_small__ 1 +#define __GCC_ATOMIC_LONG_LOCK_FREE 2 +#define __DEC32_MANT_DIG__ 7 +#define __k8__ 1 +#define __INTPTR_TYPE__ long int +#define __UINT16_TYPE__ short unsigned int +#define __WCHAR_TYPE__ int +#define __pic__ 2 +#define __UINTPTR_MAX__ 0xffffffffffffffffUL +#define __INT_FAST64_WIDTH__ 64 +#define __INT_FAST64_MAX__ 0x7fffffffffffffffL +#define __GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1 +#define __FLT_NORM_MAX__ 3.40282346638528859811704183484516925e+38F +#define __FLT32_HAS_INFINITY__ 1 +#define __FLT64X_MAX_EXP__ 16384 +#define __UINT_FAST64_TYPE__ long unsigned int +#define __BFLT16_MIN_EXP__ (-125) +#define __INT_MAX__ 0x7fffffff +#define __linux__ 1 +#define __INT64_TYPE__ long int +#define __FLT_MAX_EXP__ 128 +#define __ORDER_BIG_ENDIAN__ 4321 +#define __DBL_MANT_DIG__ 53 +#define __SIZEOF_FLOAT128__ 16 +#define __BFLT16_MANT_DIG__ 8 +#define __DEC64_MIN__ 1E-383DD +#define __WINT_TYPE__ unsigned int +#define __UINT_LEAST32_TYPE__ unsigned int +#define __SIZEOF_SHORT__ 2 +#define __FLT32_NORM_MAX__ 3.40282346638528859811704183484516925e+38F32 +#define __SSE__ 1 +#define __LDBL_MIN_EXP__ (-16381) +#define __FLT64_MAX__ 1.79769313486231570814527423731704357e+308F64 +#define __DEC64X_MIN_EXP__ (-6142) +#define __amd64__ 1 +#define __WINT_WIDTH__ 32 +#define __INT_LEAST64_WIDTH__ 64 +#define __FLT32X_MAX_10_EXP__ 308 +#define __SIZEOF_INT128__ 16 +#define __FLT16_MIN__ 6.10351562500000000000000000000000000e-5F16 +#define __FLT64X_IS_IEC_60559__ 1 +#define __GXX_CONSTEXPR_ASM__ 1 +#define __LDBL_MAX_10_EXP__ 4932 +#define __ATOMIC_RELAXED 0 +#define __DBL_EPSILON__ double(2.22044604925031308084726333618164062e-16L) +#define __INT_LEAST32_TYPE__ int +#define _LP64 1 +#define __UINT8_C(c) c +#define __FLT64_MAX_EXP__ 1024 +#define __SIZEOF_WCHAR_T__ 4 +#define __GNUC_PATCHLEVEL__ 1 +#define __FLT128_NORM_MAX__ 1.18973149535723176508575932662800702e+4932F128 +#define __FLT64_NORM_MAX__ 1.79769313486231570814527423731704357e+308F64 +#define __FLT128_HAS_QUIET_NAN__ 1 +#define __INTMAX_MAX__ 0x7fffffffffffffffL +#define __INT_FAST8_TYPE__ signed char +#define __FLT64X_MIN__ 3.36210314311209350626267781732175260e-4932F64x +#define __FLT64_EPSILON__ 2.22044604925031308084726333618164062e-16F64 +#define __STDCPP_THREADS__ 1 +#define __BFLT16_HAS_DENORM__ 1 +#define __GNUC_STDC_INLINE__ 1 +#define __FLT64_HAS_DENORM__ 1 +#define __FLT32_EPSILON__ 1.19209289550781250000000000000000000e-7F32 +#define __FLT16_HAS_DENORM__ 1 +#define __DBL_DECIMAL_DIG__ 17 +#define __STDC_UTF_32__ 1 +#define __INT_FAST8_WIDTH__ 8 +#define __FXSR__ 1 +#define __FLT32X_MAX__ 1.79769313486231570814527423731704357e+308F32x +#define __DBL_NORM_MAX__ double(1.79769313486231570814527423731704357e+308L) +#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__ +#define __GCC_DESTRUCTIVE_SIZE 64 +#define __INTMAX_WIDTH__ 64 +#define __cpp_runtime_arrays 198712L +#define __FLT32_DIG__ 6 +#define __UINT64_TYPE__ long unsigned int +#define __UINT32_C(c) c ## U +#define __cpp_alias_templates 200704L +#define __FLT_DENORM_MIN__ 1.40129846432481707092372958328991613e-45F +#define __FLT128_IS_IEC_60559__ 1 +#define __INT8_MAX__ 0x7f +#define __LONG_WIDTH__ 64 +#define __DBL_MIN__ double(2.22507385850720138309023271733240406e-308L) +#define __PIC__ 2 +#define __INT32_MAX__ 0x7fffffff +#define __UINT_FAST32_TYPE__ long unsigned int +#define __FLT16_MANT_DIG__ 11 +#define __FLT32X_NORM_MAX__ 1.79769313486231570814527423731704357e+308F32x +#define __CHAR32_TYPE__ unsigned int +#define __FLT_MAX__ 3.40282346638528859811704183484516925e+38F +#define __SSE2__ 1 +#define __BFLT16_NORM_MAX__ 3.38953138925153547590470800371487867e+38BF16 +#define __INT32_TYPE__ int +#define __SIZEOF_DOUBLE__ 8 +#define __cpp_exceptions 199711L +#define __FLT_MIN_10_EXP__ (-37) +#define __FLT64_MIN__ 2.22507385850720138309023271733240406e-308F64 +#define __INT_LEAST32_WIDTH__ 32 +#define __INTMAX_TYPE__ long int +#define __GLIBCXX_BITSIZE_INT_N_0 128 +#define __FLT32X_HAS_QUIET_NAN__ 1 +#define __ATOMIC_CONSUME 1 +#define __GNUC_MINOR__ 1 +#define __GLIBCXX_TYPE_INT_N_0 __int128 +#define __UINTMAX_MAX__ 0xffffffffffffffffUL +#define __PIE__ 2 +#define __FLT32X_DENORM_MIN__ 4.94065645841246544176568792868221372e-324F32x +#define __DBL_MAX_10_EXP__ 308 +#define __LDBL_DENORM_MIN__ 3.64519953188247460252840593361941982e-4951L +#define __INT16_C(c) c +#define __STDC__ 1 +#define __PTRDIFF_TYPE__ long int +#define __LONG_MAX__ 0x7fffffffffffffffL +#define __FLT32X_MIN_10_EXP__ (-307) +#define __UINTPTR_TYPE__ long unsigned int +#define __DEC64_SUBNORMAL_MIN__ 0.000000000000001E-383DD +#define __DEC128_MANT_DIG__ 34 +#define __LDBL_MIN_10_EXP__ (-4931) +#define __SSE_MATH__ 1 +#define __SIZEOF_LONG_LONG__ 8 +#define __cpp_user_defined_literals 200809L +#define __FLT128_DECIMAL_DIG__ 36 +#define __GCC_ATOMIC_LLONG_LOCK_FREE 2 +#define __FLT32_HAS_QUIET_NAN__ 1 +#define __FLT_DECIMAL_DIG__ 9 +#define __UINT_FAST16_MAX__ 0xffffffffffffffffUL +#define __LDBL_NORM_MAX__ 1.18973149535723176502126385303097021e+4932L +#define __GCC_ATOMIC_SHORT_LOCK_FREE 2 +#define __SIZE_MAX__ 0xffffffffffffffffUL +#define __UINT_FAST8_TYPE__ unsigned char +#define _GNU_SOURCE 1 +#define __ATOMIC_ACQ_REL 4 +#define __ATOMIC_RELEASE 3 diff --git a/src/gui/QT/partcfgdialog.cpp b/src/gui/QT/partcfgdialog.cpp new file mode 100644 index 0000000..0c50e75 --- /dev/null +++ b/src/gui/QT/partcfgdialog.cpp @@ -0,0 +1,144 @@ +#include "partcfgdialog.h" +#include "ui_partcfgdialog.h" +#include +#include + +PartCfgDialog::PartCfgDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::PartCfgDialog) +{ + reserve = false; + unit = 1; + align = true; + valuestr = ""; + resvalue = 0; + m_fs_type = 0; + m_cluster_size = 0; + + ui->setupUi(this); + + ui->lineEdit->setEnabled(false); + ui->comboBox->setEnabled(false); +} + +PartCfgDialog::~PartCfgDialog() +{ + delete ui; +} + +void PartCfgDialog::update_ui_status() +{ + ui->checkBox->setChecked(reserve); + ui->lineEdit->setEnabled(reserve); + ui->comboBox->setEnabled(reserve); + ui->checkBox_2->setChecked(align); + ui->comboBoxFsType->setCurrentIndex(m_fs_type); + + if (m_cluster_size > 0) + { + ui->lineEditClusterSize->setText(QString::number(m_cluster_size)); + } + else + { + ui->lineEditClusterSize->setText(""); + } +} + +void PartCfgDialog::update_language_ui(QJsonObject &obj) +{ + ui->checkBox->setText(_LANG_STR("STR_PRESERVE_SPACE")); + ui->checkBox_2->setText(_LANG_STR("STR_PART_ALIGN_4KB")); + ui->labelFsType->setText(_LANG_STR("STR_FS_TYPE")); + ui->labelClusterSize->setText(_LANG_STR("STR_CLUSTER_SIZE")); + ui->pushButtonOK->setText(_LANG_STR("STR_BTN_OK")); + ui->pushButtonCancel->setText(_LANG_STR("STR_BTN_CANCEL")); + + invalid_value = _LANG_STR("STR_SPACE_VAL_INVALID"); + invalid_cluster = _LANG_STR("STR_SPACE_VAL_INVALID"); + err_title = _LANG_STR("STR_ERROR"); +} + +void PartCfgDialog::on_pushButtonOK_clicked() +{ + if (ui->checkBox->isChecked()) + { + QString str = ui->lineEdit->text(); + + if (str.isEmpty()) + { + QMessageBox::critical(this, err_title, invalid_value); + return; + } + + for (int i = 0; i < str.size(); i++) + { + if (str[i] < '0' || str[i] > '9') + { + QMessageBox::critical(this, err_title, invalid_value); + return; + } + } + + valuestr = str; + resvalue = str.toLongLong(); + reserve = true; + } + else + { + reserve = false; + } + + align = ui->checkBox_2->isChecked(); + unit = ui->comboBox->currentIndex(); + m_fs_type = ui->comboBoxFsType->currentIndex(); + + { + QString cstr = ui->lineEditClusterSize->text().trimmed(); + + if (cstr.isEmpty()) + { + m_cluster_size = 0; + } + else + { + for (int i = 0; i < cstr.size(); i++) + { + if (cstr[i] < '0' || cstr[i] > '9') + { + QMessageBox::critical(this, err_title, invalid_cluster); + return; + } + } + + m_cluster_size = cstr.toInt(); + if (m_cluster_size <= 0) + { + QMessageBox::critical(this, err_title, invalid_cluster); + return; + } + } + } + + accept(); +} + +void PartCfgDialog::on_pushButtonCancel_clicked() +{ + reject(); +} + +void PartCfgDialog::on_checkBox_stateChanged(int arg1) +{ + (void)arg1; + + if (ui->checkBox->isChecked()) + { + ui->lineEdit->setEnabled(true); + ui->comboBox->setEnabled(true); + } + else + { + ui->lineEdit->setEnabled(false); + ui->comboBox->setEnabled(false); + } +} diff --git a/src/gui/QT/partcfgdialog.h b/src/gui/QT/partcfgdialog.h new file mode 100644 index 0000000..b28aa9c --- /dev/null +++ b/src/gui/QT/partcfgdialog.h @@ -0,0 +1,48 @@ +#ifndef PARTCFGDIALOG_H +#define PARTCFGDIALOG_H + +#include +#include + +namespace Ui { +class PartCfgDialog; +} + +class PartCfgDialog : public QDialog +{ + Q_OBJECT + +public: + + bool reserve; + int unit; + bool align; + QString valuestr; + qint64 resvalue; + + int m_fs_type; + int m_cluster_size; + + QString invalid_value; + QString err_title; + QString invalid_cluster; + void update_ui_status(); + void update_language_ui(QJsonObject &obj); + + explicit PartCfgDialog(QWidget *parent = nullptr); + ~PartCfgDialog(); + +private slots: + void on_pushButtonOK_clicked(); + + void on_pushButtonCancel_clicked(); + + void on_checkBox_stateChanged(int arg1); + +private: + Ui::PartCfgDialog *ui; +}; + +#define _LANG_STR(id) obj.value(id).toString() + +#endif // PARTCFGDIALOG_H diff --git a/src/gui/QT/partcfgdialog.ui b/src/gui/QT/partcfgdialog.ui new file mode 100644 index 0000000..16d8759 --- /dev/null +++ b/src/gui/QT/partcfgdialog.ui @@ -0,0 +1,253 @@ + + + PartCfgDialog + + + + 0 + 0 + 420 + 358 + + + + Partition Configuration + + + + + 90 + 310 + 90 + 30 + + + + OK + + + + + + 230 + 310 + 90 + 30 + + + + Cancel + + + + + + 10 + 10 + 400 + 51 + + + + + + + + + 10 + 10 + 381 + 41 + + + + Preserve some space at the end of the disk + + + 0 + + + + + + + 10 + 60 + 200 + 60 + + + + + + + + + 10 + 20 + 181 + 26 + + + + 14 + + + + + + + 210 + 60 + 200 + 60 + + + + + + + + + 10 + 20 + 181 + 26 + + + + 1 + + + + MB + + + + + GB + + + + + + + + 10 + 130 + 401 + 51 + + + + + + + + + 10 + 18 + 381 + 24 + + + + Align partitions with 4KB + + + true + + + + + + + 10 + 190 + 401 + 51 + + + + + + + + + 10 + 15 + 120 + 21 + + + + Filesystem: + + + + + + 140 + 12 + 241 + 26 + + + + 0 + + + + exFAT + + + + + NTFS + + + + + + + + 10 + 250 + 401 + 51 + + + + + + + + + 10 + 15 + 200 + 21 + + + + Cluster Size (sectors): + + + + + + 220 + 12 + 161 + 26 + + + + 10 + + + + + + + diff --git a/src/gui/QT/refresh_icon_data.c b/src/gui/QT/refresh_icon_data.c new file mode 100644 index 0000000..838371d --- /dev/null +++ b/src/gui/QT/refresh_icon_data.c @@ -0,0 +1,300 @@ +/****************************************************************************** + * refresh_icon_data.c + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + +#include +#include + +static unsigned char refresh_icon_hexData[4286] = { + 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x20, 0x20, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0xA8, 0x10, + 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x27, + 0x00, 0x00, 0x10, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, + 0x32, 0x2D, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, + 0x32, 0x81, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x2D, 0xA6, 0xBE, + 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0xBF, 0xA6, 0xBE, + 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, + 0x32, 0xBF, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x10, 0xA6, 0xBE, + 0x32, 0x71, 0xA6, 0xBE, 0x32, 0xD9, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xDA, 0xA6, 0xBE, 0x32, 0x71, 0xA6, 0xBE, + 0x32, 0x10, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, 0x32, 0xB2, 0xA6, 0xBE, + 0x32, 0xFE, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA5, 0xBD, + 0x2F, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFE, 0xA6, 0xBE, + 0x32, 0xB2, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x35, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA5, 0xBE, + 0x31, 0xFF, 0xAC, 0xC3, 0x40, 0xFF, 0xB7, 0xCA, 0x59, 0xFF, 0xBF, 0xD0, 0x6B, 0xFF, 0xC0, 0xD1, + 0x6E, 0xFF, 0xBA, 0xCD, 0x60, 0xFF, 0xAF, 0xC5, 0x48, 0xFF, 0xA7, 0xBF, 0x34, 0xFF, 0xA5, 0xBD, + 0x2F, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0x35, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x29, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xB5, 0xC9, 0x54, 0xFF, 0xD4, 0xE0, + 0x9D, 0xFF, 0xED, 0xF2, 0xD6, 0xFF, 0xF9, 0xFB, 0xF1, 0xFF, 0xFD, 0xFD, 0xFA, 0xFF, 0xFD, 0xFE, + 0xFB, 0xFF, 0xFB, 0xFC, 0xF5, 0xFF, 0xF2, 0xF6, 0xE1, 0xFF, 0xDD, 0xE6, 0xB1, 0xFF, 0xBD, 0xCF, + 0x67, 0xFF, 0xA7, 0xBF, 0x35, 0xFF, 0xA5, 0xBE, 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x10, 0xA6, 0xBE, + 0x32, 0xB2, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x31, 0xFF, 0xA8, 0xC0, 0x37, 0xFF, 0xCB, 0xD9, 0x87, 0xFF, 0xF4, 0xF7, 0xE6, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xFB, + 0xF4, 0xFF, 0xD9, 0xE4, 0xA8, 0xFF, 0xAF, 0xC4, 0x46, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xB2, 0xA6, 0xBE, + 0x32, 0x10, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x71, 0xA6, 0xBE, + 0x32, 0xFE, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA9, 0xC0, + 0x38, 0xFF, 0xD5, 0xE0, 0x9D, 0xFF, 0xFD, 0xFE, 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, + 0xFD, 0xFF, 0xEE, 0xF3, 0xD9, 0xFF, 0xD9, 0xE3, 0xA8, 0xFF, 0xCC, 0xDA, 0x8A, 0xFF, 0xCA, 0xD8, + 0x85, 0xFF, 0xD3, 0xDF, 0x99, 0xFF, 0xE6, 0xEC, 0xC4, 0xFF, 0xFA, 0xFB, 0xF3, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xED, 0xC7, 0xFF, 0xB1, 0xC6, 0x4C, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFE, 0xA6, 0xBE, + 0x32, 0x71, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0xDA, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xCD, 0xDB, + 0x8C, 0xFF, 0xFD, 0xFE, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0xF7, 0xE7, 0xFF, 0xCB, 0xD9, + 0x87, 0xFF, 0xAE, 0xC3, 0x43, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA4, 0xBD, 0x2F, 0xFF, 0xA4, 0xBD, + 0x2E, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA9, 0xC0, 0x38, 0xFF, 0xBD, 0xCF, 0x66, 0xFF, 0xE8, 0xEE, + 0xC9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0xEB, 0xC1, 0xFF, 0xAD, 0xC3, + 0x41, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xDA, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBD, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA4, 0xBC, 0x2D, 0xFF, 0xB8, 0xCB, 0x5C, 0xFF, 0xF6, 0xF9, + 0xEB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0xF5, 0xDF, 0xFF, 0xBA, 0xCD, 0x60, 0xFF, 0xA4, 0xBD, + 0x2E, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xAE, 0xC4, + 0x44, 0xFF, 0xE2, 0xE9, 0xBB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xD6, + 0x7E, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0xC0, 0xA6, 0xBE, 0x32, 0xFF, 0xA9, 0xC0, + 0x39, 0xFF, 0xC8, 0xD7, 0x80, 0xFF, 0xD0, 0xDC, 0x92, 0xFF, 0xE7, 0xEE, 0xC8, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0xED, 0xC5, 0xFF, 0xCC, 0xDA, 0x8A, 0xFF, 0xB0, 0xC5, + 0x49, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xB0, 0xC6, 0x4A, 0xFF, 0xE3, 0xEA, 0xBE, 0xFF, 0xEA, 0xEF, 0xCE, 0xFF, 0xB8, 0xCB, + 0x5C, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xBF, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x2E, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0xFF, 0xA8, 0xC0, + 0x37, 0xFF, 0xE0, 0xE8, 0xB8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xF6, 0xE3, 0xFF, 0xB3, 0xC7, + 0x4F, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xAA, 0xC1, 0x3A, 0xFF, 0xAB, 0xC1, 0x3D, 0xFF, 0xA6, 0xBE, + 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0x2D, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xB6, 0xCA, 0x58, 0xFF, 0xF4, 0xF7, 0xE6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFE, 0xFB, 0xFF, 0xC9, 0xD8, 0x84, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA5, 0xBE, 0x30, 0xFF, 0xCD, 0xDB, 0x8C, 0xFF, 0xFE, 0xFE, 0xFD, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0xEA, 0xBC, 0xFF, 0xAA, 0xC1, 0x3A, 0xFF, 0xA6, 0xBE, + 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xAB, 0xC2, 0x3E, 0xFF, 0xBB, 0xCE, 0x63, 0xFF, 0xA7, 0xBF, + 0x35, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xAB, 0xC2, 0x3E, 0xFF, 0xE6, 0xED, 0xC5, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF5, 0xF8, 0xE8, 0xFF, 0xB7, 0xCB, 0x5A, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xCE, 0xDB, 0x8F, 0xFF, 0xF7, 0xF9, 0xEC, 0xFF, 0xBD, 0xCF, + 0x67, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xBB, 0xCD, 0x63, 0xFF, 0xF6, 0xF8, + 0xEA, 0xFF, 0xCE, 0xDB, 0x8F, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xB7, 0xCB, 0x5A, 0xFF, 0xF5, 0xF8, 0xE8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0xEE, + 0xC9, 0xFF, 0xAC, 0xC2, 0x40, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA7, 0xBF, 0x34, 0xFF, 0xBA, 0xCD, + 0x60, 0xFF, 0xAB, 0xC2, 0x3E, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xAA, 0xC1, + 0x3A, 0xFF, 0xE2, 0xEA, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFE, 0xFF, 0xCF, 0xDC, 0x90, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, + 0x2F, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xC9, 0xD8, + 0x84, 0xFF, 0xFD, 0xFE, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF5, 0xF8, 0xE9, 0xFF, 0xB8, 0xCB, 0x5B, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x2E, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA9, 0xC0, + 0x38, 0xFF, 0xA8, 0xBF, 0x37, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xB2, 0xC7, 0x4F, 0xFF, 0xF2, 0xF6, + 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0xE9, 0xBB, 0xFF, 0xA9, 0xC0, 0x38, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0x2D, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0xC0, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xB5, 0xC9, 0x54, 0xFF, 0xE4, 0xEB, + 0xC1, 0xFF, 0xDF, 0xE8, 0xB5, 0xFF, 0xAF, 0xC5, 0x47, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xAF, 0xC5, 0x47, 0xFF, 0xCA, 0xD8, + 0x85, 0xFF, 0xE2, 0xE9, 0xBB, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0xEF, + 0xCD, 0xFF, 0xCE, 0xDB, 0x8F, 0xFF, 0xC7, 0xD6, 0x7E, 0xFF, 0xA9, 0xC0, 0x39, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xBF, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBD, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x73, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xC6, 0xD6, 0x7C, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xE8, 0xB5, 0xFF, 0xAC, 0xC3, 0x40, 0xFF, 0xA5, 0xBD, + 0x2F, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA4, 0xBD, 0x2E, 0xFF, 0xB5, 0xC9, + 0x55, 0xFF, 0xED, 0xF2, 0xD6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFB, 0xF1, 0xFF, 0xBC, 0xCE, + 0x65, 0xFF, 0xA4, 0xBC, 0x2C, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0xDA, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xAE, 0xC4, 0x44, 0xFF, 0xE6, 0xED, + 0xC6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0xEB, 0xC1, 0xFF, 0xB9, 0xCC, + 0x5E, 0xFF, 0xA7, 0xBF, 0x35, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA4, 0xBD, 0x2E, 0xFF, 0xA4, 0xBD, + 0x2E, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xAB, 0xC1, 0x3D, 0xFF, 0xC5, 0xD5, 0x79, 0xFF, 0xF1, 0xF5, + 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xD3, 0xDF, 0x99, 0xFF, 0xA7, 0xBE, + 0x33, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xDA, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, + 0x32, 0xFE, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xB3, 0xC8, + 0x51, 0xFF, 0xE9, 0xEF, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFA, + 0xEE, 0xFF, 0xE1, 0xE9, 0xBA, 0xFF, 0xCD, 0xDB, 0x8C, 0xFF, 0xC4, 0xD4, 0x78, 0xFF, 0xC6, 0xD6, + 0x7C, 0xFF, 0xD3, 0xDF, 0x9A, 0xFF, 0xE9, 0xEF, 0xCD, 0xFF, 0xFC, 0xFD, 0xF9, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xDB, 0xE4, 0xAB, 0xFF, 0xAA, 0xC1, 0x3C, 0xFF, 0xA6, 0xBE, + 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFE, 0xA6, 0xBE, + 0x32, 0x71, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x10, 0xA6, 0xBE, + 0x32, 0xB3, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xB1, 0xC6, 0x4B, 0xFF, 0xDD, 0xE6, 0xB2, 0xFF, 0xFC, 0xFD, 0xF8, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, + 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFA, + 0xEE, 0xFF, 0xD1, 0xDE, 0x96, 0xFF, 0xAA, 0xC1, 0x3C, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xB2, 0xA6, 0xBE, + 0x32, 0x10, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x29, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA9, 0xC0, 0x38, 0xFF, 0xC1, 0xD2, 0x71, 0xFF, 0xE2, 0xEA, + 0xBC, 0xFF, 0xF5, 0xF8, 0xE9, 0xFF, 0xFD, 0xFD, 0xFA, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, + 0xFE, 0xFF, 0xFB, 0xFC, 0xF7, 0xFF, 0xF2, 0xF5, 0xE1, 0xFF, 0xDB, 0xE5, 0xAC, 0xFF, 0xB9, 0xCC, + 0x5F, 0xFF, 0xA6, 0xBE, 0x33, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x35, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA8, 0xBF, + 0x36, 0xFF, 0xB3, 0xC7, 0x4F, 0xFF, 0xBF, 0xD0, 0x6B, 0xFF, 0xC5, 0xD5, 0x7A, 0xFF, 0xC4, 0xD4, + 0x78, 0xFF, 0xBC, 0xCE, 0x64, 0xFF, 0xB0, 0xC5, 0x48, 0xFF, 0xA6, 0xBE, 0x33, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0x35, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, 0x32, 0xB2, 0xA6, 0xBE, + 0x32, 0xFE, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA4, 0xBD, 0x2E, 0xFF, 0xA4, 0xBD, + 0x2E, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFE, 0xA6, 0xBE, + 0x32, 0xB3, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x10, 0xA6, 0xBE, + 0x32, 0x71, 0xA6, 0xBE, 0x32, 0xDA, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xDA, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, + 0x32, 0x10, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0xBF, 0xA6, 0xBE, + 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, + 0x32, 0xC0, 0xA6, 0xBE, 0x32, 0x73, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, + 0x32, 0x2D, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, + 0x32, 0x81, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x2E, 0xA6, 0xBE, + 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBD, 0x31, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, + 0x01, 0xFF, 0xFE, 0x00, 0x00, 0x7F, 0xF8, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x0F, 0xE0, 0x00, + 0x00, 0x07, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, + 0x00, 0x01, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x07, 0xF0, 0x00, + 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0xFF +}; + +void *get_refresh_icon_raw_data(int *len) +{ + *len = (int)sizeof(refresh_icon_hexData); + return refresh_icon_hexData; +} + diff --git a/src/gui/QT/secure_icon_data.c b/src/gui/QT/secure_icon_data.c new file mode 100644 index 0000000..b3f8b7e --- /dev/null +++ b/src/gui/QT/secure_icon_data.c @@ -0,0 +1,91 @@ +/****************************************************************************** + * secure_icon_data.c + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + +#include +#include + +static unsigned char secure_icon_hexData[958] = { + 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xA8, 0x03, + 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x03, 0x00, 0x00, 0x46, 0x5C, + 0x00, 0x00, 0x46, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, + 0xFB, 0x01, 0x00, 0x8C, 0xFB, 0x2E, 0x00, 0x8C, 0xFB, 0x52, 0x00, 0x8C, 0xFB, 0x53, 0x00, 0x8C, + 0xFB, 0x53, 0x00, 0x8C, 0xFB, 0x53, 0x00, 0x8C, 0xFB, 0x53, 0x00, 0x8C, 0xFB, 0x53, 0x00, 0x8C, + 0xFB, 0x53, 0x00, 0x8C, 0xFB, 0x53, 0x00, 0x8C, 0xFB, 0x52, 0x00, 0x8C, 0xFB, 0x2E, 0x00, 0x8C, + 0xFB, 0x01, 0x00, 0x8C, 0xFB, 0x3E, 0x00, 0x8C, 0xFB, 0xDA, 0x00, 0x8C, 0xFB, 0xF8, 0x00, 0x8C, + 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF7, 0x00, 0x8C, + 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF8, 0x00, 0x8C, + 0xFB, 0xDA, 0x00, 0x8C, 0xFB, 0x3E, 0x00, 0x8C, 0xFB, 0x78, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0x78, 0x00, 0x8C, 0xFB, 0x7B, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0x7B, 0x00, 0x8C, + 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x86, 0xF1, 0xFF, 0x00, 0x7C, 0xDF, 0xFF, 0x00, 0x86, 0xF1, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFC, 0xFF, 0x00, 0x7C, 0xDF, 0xFF, 0x00, 0x6C, 0xC4, 0xFF, 0x00, 0x7C, + 0xDF, 0xFF, 0x00, 0x8C, 0xFC, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x87, 0xF2, 0xFF, 0x00, 0x7D, + 0xE1, 0xFF, 0x00, 0x87, 0xF2, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0x7B, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFC, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0x7B, 0x00, 0x8C, + 0xFB, 0x77, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0x77, 0x00, 0x8C, 0xFB, 0x3A, 0x00, 0x8C, 0xFB, 0xD4, 0x01, 0x8B, 0xF9, 0xF7, 0x03, 0x89, + 0xF3, 0xFF, 0x01, 0x8B, 0xF8, 0xF8, 0x00, 0x8C, 0xFB, 0xF4, 0x00, 0x8C, 0xFB, 0xF4, 0x00, 0x8C, + 0xFB, 0xF4, 0x01, 0x8B, 0xF8, 0xF8, 0x03, 0x89, 0xF3, 0xFF, 0x01, 0x8B, 0xF9, 0xF7, 0x00, 0x8C, + 0xFB, 0xD4, 0x00, 0x8C, 0xFB, 0x3A, 0x00, 0x8C, 0xFB, 0x00, 0x00, 0x93, 0xFF, 0x1E, 0x1D, 0x6B, + 0xA9, 0x6B, 0x32, 0x54, 0x6F, 0xF6, 0x22, 0x65, 0x9A, 0x7D, 0x00, 0x90, 0xFF, 0x39, 0x00, 0x8C, + 0xFB, 0x3C, 0x00, 0x90, 0xFF, 0x39, 0x22, 0x65, 0x9A, 0x7D, 0x32, 0x54, 0x6F, 0xF6, 0x1D, 0x6B, + 0xA9, 0x6B, 0x00, 0x93, 0xFF, 0x1E, 0x00, 0x8C, 0xFB, 0x00, 0x00, 0x8C, 0xFB, 0x00, 0x2A, 0x5D, + 0x85, 0x00, 0x46, 0x3D, 0x36, 0x3A, 0x43, 0x41, 0x3F, 0xF3, 0x45, 0x3F, 0x3A, 0x58, 0x26, 0x62, + 0x91, 0x00, 0x00, 0x8D, 0xFD, 0x00, 0x26, 0x62, 0x91, 0x00, 0x45, 0x3F, 0x3A, 0x58, 0x43, 0x41, + 0x3F, 0xF3, 0x46, 0x3D, 0x36, 0x3A, 0x2A, 0x5D, 0x85, 0x00, 0x00, 0x8C, 0xFB, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x27, 0x42, 0x42, 0x42, 0xE9, 0x42, 0x42, + 0x42, 0x94, 0x42, 0x42, 0x42, 0x01, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x01, 0x42, 0x42, + 0x42, 0x94, 0x42, 0x42, 0x42, 0xE9, 0x42, 0x42, 0x42, 0x27, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x04, 0x42, 0x42, + 0x42, 0x96, 0x42, 0x42, 0x42, 0xF5, 0x42, 0x42, 0x42, 0x8E, 0x42, 0x42, 0x42, 0x53, 0x42, 0x42, + 0x42, 0x8E, 0x42, 0x42, 0x42, 0xF5, 0x42, 0x42, 0x42, 0x96, 0x42, 0x42, 0x42, 0x04, 0x42, 0x42, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, + 0x42, 0x00, 0x42, 0x42, 0x42, 0x16, 0x42, 0x42, 0x42, 0x96, 0x42, 0x42, 0x42, 0xE9, 0x42, 0x42, + 0x42, 0xF3, 0x42, 0x42, 0x42, 0xE9, 0x42, 0x42, 0x42, 0x96, 0x42, 0x42, 0x42, 0x16, 0x42, 0x42, + 0x42, 0x00, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, + 0x42, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x05, 0x42, 0x42, + 0x42, 0x31, 0x42, 0x42, 0x42, 0x4B, 0x42, 0x42, 0x42, 0x31, 0x42, 0x42, 0x42, 0x05, 0x42, 0x42, + 0x42, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, + 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00 +}; + +void *get_secure_icon_raw_data(int *len) +{ + *len = (int)sizeof(secure_icon_hexData); + return secure_icon_hexData; +} diff --git a/src/gui/QT/ui_hiperiso2diskwindow.h b/src/gui/QT/ui_hiperiso2diskwindow.h new file mode 100644 index 0000000..a1e493b --- /dev/null +++ b/src/gui/QT/ui_hiperiso2diskwindow.h @@ -0,0 +1,212 @@ +/******************************************************************************** +** Form generated from reading UI file 'hiperiso2diskwindow.ui' +** +** Created by: Qt User Interface Compiler version 5.15.19 +** +** WARNING! All changes made in this file will be lost when recompiling UI file! +********************************************************************************/ + +#ifndef UI_HIPERISO2DISKWINDOW_H +#define UI_HIPERISO2DISKWINDOW_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class Ui_Hiperiso2DiskWindow +{ +public: + QAction *actionSecure_Boot_Support; + QAction *actionMBR; + QAction *actionGPT; + QAction *actionPartition_Configuration; + QAction *actionClear_Hiperiso; + QAction *actionShow_All_Devices; + QAction *actionAbout; + QWidget *centralwidget; + QGroupBox *groupBoxDevice; + QComboBox *comboBoxDevice; + QPushButton *ButtonRefresh; + QGroupBox *groupBoxHiperisoLocal; + QLabel *labelHiperisoLocalVer; + QLabel *labelHiperisoLocalPartStyle; + QLabel *labelHiperisoLocalSecure; + QGroupBox *groupBoxHiperisoDevice; + QLabel *labelHiperisoDeviceVer; + QLabel *labelHiperisoDevicePartStyle; + QLabel *labelHiperisoDeviceSecure; + QGroupBox *groupBoxStatus; + QProgressBar *progressBar; + QPushButton *ButtonInstall; + QPushButton *ButtonUpdate; + QMenuBar *menubar; + QMenu *menuOption; + QMenu *menuPartition_Style; + QMenu *menuLanguage; + QMenu *menuHelp; + + void setupUi(QMainWindow *Hiperiso2DiskWindow) + { + if (Hiperiso2DiskWindow->objectName().isEmpty()) + Hiperiso2DiskWindow->setObjectName(QString::fromUtf8("Hiperiso2DiskWindow")); + Hiperiso2DiskWindow->resize(696, 418); + Hiperiso2DiskWindow->setMinimumSize(QSize(696, 418)); + actionSecure_Boot_Support = new QAction(Hiperiso2DiskWindow); + actionSecure_Boot_Support->setObjectName(QString::fromUtf8("actionSecure_Boot_Support")); + actionSecure_Boot_Support->setCheckable(true); + actionMBR = new QAction(Hiperiso2DiskWindow); + actionMBR->setObjectName(QString::fromUtf8("actionMBR")); + actionMBR->setCheckable(true); + actionGPT = new QAction(Hiperiso2DiskWindow); + actionGPT->setObjectName(QString::fromUtf8("actionGPT")); + actionGPT->setCheckable(true); + actionPartition_Configuration = new QAction(Hiperiso2DiskWindow); + actionPartition_Configuration->setObjectName(QString::fromUtf8("actionPartition_Configuration")); + actionClear_Hiperiso = new QAction(Hiperiso2DiskWindow); + actionClear_Hiperiso->setObjectName(QString::fromUtf8("actionClear_Hiperiso")); + actionShow_All_Devices = new QAction(Hiperiso2DiskWindow); + actionShow_All_Devices->setObjectName(QString::fromUtf8("actionShow_All_Devices")); + actionShow_All_Devices->setCheckable(true); + actionAbout = new QAction(Hiperiso2DiskWindow); + actionAbout->setObjectName(QString::fromUtf8("actionAbout")); + centralwidget = new QWidget(Hiperiso2DiskWindow); + centralwidget->setObjectName(QString::fromUtf8("centralwidget")); + groupBoxDevice = new QGroupBox(centralwidget); + groupBoxDevice->setObjectName(QString::fromUtf8("groupBoxDevice")); + groupBoxDevice->setGeometry(QRect(12, 11, 672, 88)); + comboBoxDevice = new QComboBox(groupBoxDevice); + comboBoxDevice->setObjectName(QString::fromUtf8("comboBoxDevice")); + comboBoxDevice->setGeometry(QRect(12, 44, 600, 29)); + ButtonRefresh = new QPushButton(groupBoxDevice); + ButtonRefresh->setObjectName(QString::fromUtf8("ButtonRefresh")); + ButtonRefresh->setGeometry(QRect(624, 41, 36, 33)); + QIcon icon; + icon.addFile(QString::fromUtf8("../refresh.ico"), QSize(), QIcon::Normal, QIcon::Off); + ButtonRefresh->setIcon(icon); + ButtonRefresh->setIconSize(QSize(24, 24)); + groupBoxHiperisoLocal = new QGroupBox(centralwidget); + groupBoxHiperisoLocal->setObjectName(QString::fromUtf8("groupBoxHiperisoLocal")); + groupBoxHiperisoLocal->setGeometry(QRect(12, 110, 330, 88)); + groupBoxHiperisoLocal->setAlignment(Qt::AlignCenter); + labelHiperisoLocalVer = new QLabel(groupBoxHiperisoLocal); + labelHiperisoLocalVer->setObjectName(QString::fromUtf8("labelHiperisoLocalVer")); + labelHiperisoLocalVer->setGeometry(QRect(36, 33, 240, 45)); + labelHiperisoLocalVer->setAlignment(Qt::AlignCenter); + labelHiperisoLocalPartStyle = new QLabel(groupBoxHiperisoLocal); + labelHiperisoLocalPartStyle->setObjectName(QString::fromUtf8("labelHiperisoLocalPartStyle")); + labelHiperisoLocalPartStyle->setGeometry(QRect(286, 66, 37, 20)); + labelHiperisoLocalSecure = new QLabel(groupBoxHiperisoLocal); + labelHiperisoLocalSecure->setObjectName(QString::fromUtf8("labelHiperisoLocalSecure")); + labelHiperisoLocalSecure->setGeometry(QRect(14, 40, 25, 34)); + labelHiperisoLocalSecure->setPixmap(QPixmap(QString::fromUtf8("../secure.ico"))); + groupBoxHiperisoDevice = new QGroupBox(centralwidget); + groupBoxHiperisoDevice->setObjectName(QString::fromUtf8("groupBoxHiperisoDevice")); + groupBoxHiperisoDevice->setGeometry(QRect(354, 110, 330, 88)); + groupBoxHiperisoDevice->setAlignment(Qt::AlignCenter); + labelHiperisoDeviceVer = new QLabel(groupBoxHiperisoDevice); + labelHiperisoDeviceVer->setObjectName(QString::fromUtf8("labelHiperisoDeviceVer")); + labelHiperisoDeviceVer->setGeometry(QRect(36, 33, 240, 45)); + labelHiperisoDeviceVer->setAlignment(Qt::AlignCenter); + labelHiperisoDevicePartStyle = new QLabel(groupBoxHiperisoDevice); + labelHiperisoDevicePartStyle->setObjectName(QString::fromUtf8("labelHiperisoDevicePartStyle")); + labelHiperisoDevicePartStyle->setGeometry(QRect(286, 66, 37, 20)); + labelHiperisoDeviceSecure = new QLabel(groupBoxHiperisoDevice); + labelHiperisoDeviceSecure->setObjectName(QString::fromUtf8("labelHiperisoDeviceSecure")); + labelHiperisoDeviceSecure->setGeometry(QRect(14, 40, 25, 34)); + labelHiperisoDeviceSecure->setPixmap(QPixmap(QString::fromUtf8("../secure.ico"))); + groupBoxStatus = new QGroupBox(centralwidget); + groupBoxStatus->setObjectName(QString::fromUtf8("groupBoxStatus")); + groupBoxStatus->setGeometry(QRect(12, 209, 672, 67)); + progressBar = new QProgressBar(groupBoxStatus); + progressBar->setObjectName(QString::fromUtf8("progressBar")); + progressBar->setGeometry(QRect(12, 33, 648, 25)); + progressBar->setValue(0); + progressBar->setTextVisible(true); + ButtonInstall = new QPushButton(centralwidget); + ButtonInstall->setObjectName(QString::fromUtf8("ButtonInstall")); + ButtonInstall->setGeometry(QRect(180, 302, 121, 45)); + ButtonUpdate = new QPushButton(centralwidget); + ButtonUpdate->setObjectName(QString::fromUtf8("ButtonUpdate")); + ButtonUpdate->setGeometry(QRect(396, 302, 121, 45)); + Hiperiso2DiskWindow->setCentralWidget(centralwidget); + menubar = new QMenuBar(Hiperiso2DiskWindow); + menubar->setObjectName(QString::fromUtf8("menubar")); + menubar->setGeometry(QRect(0, 0, 696, 25)); + menuOption = new QMenu(menubar); + menuOption->setObjectName(QString::fromUtf8("menuOption")); + menuPartition_Style = new QMenu(menuOption); + menuPartition_Style->setObjectName(QString::fromUtf8("menuPartition_Style")); + menuLanguage = new QMenu(menubar); + menuLanguage->setObjectName(QString::fromUtf8("menuLanguage")); + menuHelp = new QMenu(menubar); + menuHelp->setObjectName(QString::fromUtf8("menuHelp")); + Hiperiso2DiskWindow->setMenuBar(menubar); + + menubar->addAction(menuOption->menuAction()); + menubar->addAction(menuLanguage->menuAction()); + menubar->addAction(menuHelp->menuAction()); + menuOption->addAction(actionSecure_Boot_Support); + menuOption->addAction(menuPartition_Style->menuAction()); + menuOption->addAction(actionPartition_Configuration); + menuOption->addAction(actionClear_Hiperiso); + menuOption->addAction(actionShow_All_Devices); + menuPartition_Style->addAction(actionMBR); + menuPartition_Style->addAction(actionGPT); + menuHelp->addAction(actionAbout); + + retranslateUi(Hiperiso2DiskWindow); + + QMetaObject::connectSlotsByName(Hiperiso2DiskWindow); + } // setupUi + + void retranslateUi(QMainWindow *Hiperiso2DiskWindow) + { + Hiperiso2DiskWindow->setWindowTitle(QCoreApplication::translate("Hiperiso2DiskWindow", "Hiperiso2Disk", nullptr)); + actionSecure_Boot_Support->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "Secure Boot Support", nullptr)); + actionMBR->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "MBR", nullptr)); + actionGPT->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "GPT", nullptr)); + actionPartition_Configuration->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "Partition Configuration", nullptr)); + actionClear_Hiperiso->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "Clear Hiperiso", nullptr)); + actionShow_All_Devices->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "Show All Devices", nullptr)); + actionAbout->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "About", nullptr)); + groupBoxDevice->setTitle(QCoreApplication::translate("Hiperiso2DiskWindow", "Device", nullptr)); + ButtonRefresh->setText(QString()); + groupBoxHiperisoLocal->setTitle(QCoreApplication::translate("Hiperiso2DiskWindow", "Hiperiso In Package", nullptr)); + labelHiperisoLocalVer->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "

1.0.53

", nullptr)); + labelHiperisoLocalPartStyle->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "

MBR

", nullptr)); + labelHiperisoLocalSecure->setText(QString()); + groupBoxHiperisoDevice->setTitle(QCoreApplication::translate("Hiperiso2DiskWindow", "Hiperiso In Device", nullptr)); + labelHiperisoDeviceVer->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "

1.0.52

", nullptr)); + labelHiperisoDevicePartStyle->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "

GPT

", nullptr)); + labelHiperisoDeviceSecure->setText(QString()); + groupBoxStatus->setTitle(QCoreApplication::translate("Hiperiso2DiskWindow", "Status: READY", nullptr)); + progressBar->setFormat(QCoreApplication::translate("Hiperiso2DiskWindow", "%p%", nullptr)); + ButtonInstall->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "Install", nullptr)); + ButtonUpdate->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "Update", nullptr)); + menuOption->setTitle(QCoreApplication::translate("Hiperiso2DiskWindow", "Option", nullptr)); + menuPartition_Style->setTitle(QCoreApplication::translate("Hiperiso2DiskWindow", "Partition Style", nullptr)); + menuLanguage->setTitle(QCoreApplication::translate("Hiperiso2DiskWindow", "Language", nullptr)); + menuHelp->setTitle(QCoreApplication::translate("Hiperiso2DiskWindow", "Help", nullptr)); + } // retranslateUi + +}; + +namespace Ui { + class Hiperiso2DiskWindow: public Ui_Hiperiso2DiskWindow {}; +} // namespace Ui + +QT_END_NAMESPACE + +#endif // UI_HIPERISO2DISKWINDOW_H diff --git a/src/gui/QT/ui_partcfgdialog.h b/src/gui/QT/ui_partcfgdialog.h new file mode 100644 index 0000000..a328b5d --- /dev/null +++ b/src/gui/QT/ui_partcfgdialog.h @@ -0,0 +1,146 @@ +/******************************************************************************** +** Form generated from reading UI file 'partcfgdialog.ui' +** +** Created by: Qt User Interface Compiler version 5.15.19 +** +** WARNING! All changes made in this file will be lost when recompiling UI file! +********************************************************************************/ + +#ifndef UI_PARTCFGDIALOG_H +#define UI_PARTCFGDIALOG_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class Ui_PartCfgDialog +{ +public: + QPushButton *pushButtonOK; + QPushButton *pushButtonCancel; + QGroupBox *groupBox; + QCheckBox *checkBox; + QGroupBox *groupBox_2; + QLineEdit *lineEdit; + QGroupBox *groupBox_3; + QComboBox *comboBox; + QGroupBox *groupBox_4; + QCheckBox *checkBox_2; + QGroupBox *groupBox_5; + QLabel *labelFsType; + QComboBox *comboBoxFsType; + QGroupBox *groupBox_6; + QLabel *labelClusterSize; + QLineEdit *lineEditClusterSize; + + void setupUi(QDialog *PartCfgDialog) + { + if (PartCfgDialog->objectName().isEmpty()) + PartCfgDialog->setObjectName(QString::fromUtf8("PartCfgDialog")); + PartCfgDialog->resize(420, 358); + pushButtonOK = new QPushButton(PartCfgDialog); + pushButtonOK->setObjectName(QString::fromUtf8("pushButtonOK")); + pushButtonOK->setGeometry(QRect(90, 310, 90, 30)); + pushButtonCancel = new QPushButton(PartCfgDialog); + pushButtonCancel->setObjectName(QString::fromUtf8("pushButtonCancel")); + pushButtonCancel->setGeometry(QRect(230, 310, 90, 30)); + groupBox = new QGroupBox(PartCfgDialog); + groupBox->setObjectName(QString::fromUtf8("groupBox")); + groupBox->setGeometry(QRect(10, 10, 400, 51)); + checkBox = new QCheckBox(groupBox); + checkBox->setObjectName(QString::fromUtf8("checkBox")); + checkBox->setGeometry(QRect(10, 10, 381, 41)); + checkBox->setAutoRepeatInterval(0); + groupBox_2 = new QGroupBox(PartCfgDialog); + groupBox_2->setObjectName(QString::fromUtf8("groupBox_2")); + groupBox_2->setGeometry(QRect(10, 60, 200, 60)); + lineEdit = new QLineEdit(groupBox_2); + lineEdit->setObjectName(QString::fromUtf8("lineEdit")); + lineEdit->setGeometry(QRect(10, 20, 181, 26)); + lineEdit->setMaxLength(14); + groupBox_3 = new QGroupBox(PartCfgDialog); + groupBox_3->setObjectName(QString::fromUtf8("groupBox_3")); + groupBox_3->setGeometry(QRect(210, 60, 200, 60)); + comboBox = new QComboBox(groupBox_3); + comboBox->addItem(QString()); + comboBox->addItem(QString()); + comboBox->setObjectName(QString::fromUtf8("comboBox")); + comboBox->setGeometry(QRect(10, 20, 181, 26)); + groupBox_4 = new QGroupBox(PartCfgDialog); + groupBox_4->setObjectName(QString::fromUtf8("groupBox_4")); + groupBox_4->setGeometry(QRect(10, 130, 401, 51)); + checkBox_2 = new QCheckBox(groupBox_4); + checkBox_2->setObjectName(QString::fromUtf8("checkBox_2")); + checkBox_2->setGeometry(QRect(10, 18, 381, 24)); + checkBox_2->setChecked(true); + groupBox_5 = new QGroupBox(PartCfgDialog); + groupBox_5->setObjectName(QString::fromUtf8("groupBox_5")); + groupBox_5->setGeometry(QRect(10, 190, 401, 51)); + labelFsType = new QLabel(groupBox_5); + labelFsType->setObjectName(QString::fromUtf8("labelFsType")); + labelFsType->setGeometry(QRect(10, 15, 120, 21)); + comboBoxFsType = new QComboBox(groupBox_5); + comboBoxFsType->addItem(QString()); + comboBoxFsType->addItem(QString()); + comboBoxFsType->setObjectName(QString::fromUtf8("comboBoxFsType")); + comboBoxFsType->setGeometry(QRect(140, 12, 241, 26)); + groupBox_6 = new QGroupBox(PartCfgDialog); + groupBox_6->setObjectName(QString::fromUtf8("groupBox_6")); + groupBox_6->setGeometry(QRect(10, 250, 401, 51)); + labelClusterSize = new QLabel(groupBox_6); + labelClusterSize->setObjectName(QString::fromUtf8("labelClusterSize")); + labelClusterSize->setGeometry(QRect(10, 15, 200, 21)); + lineEditClusterSize = new QLineEdit(groupBox_6); + lineEditClusterSize->setObjectName(QString::fromUtf8("lineEditClusterSize")); + lineEditClusterSize->setGeometry(QRect(220, 12, 161, 26)); + lineEditClusterSize->setMaxLength(10); + + retranslateUi(PartCfgDialog); + + comboBox->setCurrentIndex(1); + comboBoxFsType->setCurrentIndex(0); + + + QMetaObject::connectSlotsByName(PartCfgDialog); + } // setupUi + + void retranslateUi(QDialog *PartCfgDialog) + { + PartCfgDialog->setWindowTitle(QCoreApplication::translate("PartCfgDialog", "Partition Configuration", nullptr)); + pushButtonOK->setText(QCoreApplication::translate("PartCfgDialog", "OK", nullptr)); + pushButtonCancel->setText(QCoreApplication::translate("PartCfgDialog", "Cancel", nullptr)); + groupBox->setTitle(QString()); + checkBox->setText(QCoreApplication::translate("PartCfgDialog", "Preserve some space at the end of the disk", nullptr)); + groupBox_2->setTitle(QString()); + groupBox_3->setTitle(QString()); + comboBox->setItemText(0, QCoreApplication::translate("PartCfgDialog", "MB", nullptr)); + comboBox->setItemText(1, QCoreApplication::translate("PartCfgDialog", "GB", nullptr)); + + groupBox_4->setTitle(QString()); + checkBox_2->setText(QCoreApplication::translate("PartCfgDialog", "Align partitions with 4KB", nullptr)); + groupBox_5->setTitle(QString()); + labelFsType->setText(QCoreApplication::translate("PartCfgDialog", "Filesystem:", nullptr)); + comboBoxFsType->setItemText(0, QCoreApplication::translate("PartCfgDialog", "exFAT", nullptr)); + comboBoxFsType->setItemText(1, QCoreApplication::translate("PartCfgDialog", "NTFS", nullptr)); + + groupBox_6->setTitle(QString()); + labelClusterSize->setText(QCoreApplication::translate("PartCfgDialog", "Cluster Size (sectors):", nullptr)); + } // retranslateUi + +}; + +namespace Ui { + class PartCfgDialog: public Ui_PartCfgDialog {}; +} // namespace Ui + +QT_END_NAMESPACE + +#endif // UI_PARTCFGDIALOG_H diff --git a/src/gui/Web/hiperiso_http.c b/src/gui/Web/hiperiso_http.c new file mode 100644 index 0000000..41daca7 --- /dev/null +++ b/src/gui/Web/hiperiso_http.c @@ -0,0 +1,1700 @@ +/****************************************************************************** + * hiperiso_http.c ---- hiperiso http + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "fat_filelib.h" + +static char *g_pub_out_buf = NULL; +static int g_pub_out_max = 0; + +static pthread_mutex_t g_api_mutex; +static char g_cur_language[128]; +static int g_cur_part_style = 0; +static int g_cur_show_all = 0; +static char g_cur_server_token[64]; +static struct mg_context *g_hiperiso_http_ctx = NULL; + +static uint32_t g_efi_part_offset = 0; +static uint8_t *g_efi_part_raw_img = NULL; +static uint8_t *g_grub_stg1_raw_img = NULL; + +static char g_cur_process_diskname[64]; +static char g_cur_process_type[64]; +static volatile int g_cur_process_result = 0; +static volatile PROGRESS_POINT g_current_progress = PT_FINISH; + +static int hiperiso_load_mbr_template(void) +{ + FILE *fp = NULL; + + fp = fopen("boot/boot.img", "rb"); + if (fp == NULL) + { + vlog("Failed to open file boot/boot.img\n"); + return 1; + } + + fread(g_mbr_template, 1, 512, fp); + fclose(fp); + + hiperiso_gen_preudo_uuid(g_mbr_template + 0x180); + return 0; +} + +static int hiperiso_disk_xz_flush(void *src, unsigned int size) +{ + memcpy(g_efi_part_raw_img + g_efi_part_offset, src, size); + g_efi_part_offset += size; + + g_current_progress = PT_LOAD_DISK_IMG + (g_efi_part_offset / SIZE_1MB); + return (int)size; +} + +static int hiperiso_unxz_efipart_img(void) +{ + int rc; + int inlen; + int xzlen; + void *xzbuf = NULL; + uint8_t *buf = NULL; + + rc = hiperiso_read_file_to_buf(HIPERISO_FILE_DISK_IMG, 0, &xzbuf, &xzlen); + vdebug("read disk.img.xz rc:%d len:%d\n", rc, xzlen); + + if (g_efi_part_raw_img) + { + buf = g_efi_part_raw_img; + } + else + { + buf = malloc(HISOEFI_PART_BYTES); + if (!buf) + { + check_free(xzbuf); + return 1; + } + } + + g_efi_part_offset = 0; + g_efi_part_raw_img = buf; + + rc = unxz(xzbuf, xzlen, NULL, hiperiso_disk_xz_flush, buf, &inlen, NULL); + vdebug("hiperiso_unxz_efipart_img len:%d rc:%d unxzlen:%u\n", inlen, rc, g_efi_part_offset); + + check_free(xzbuf); + return 0; +} + +static int hiperiso_unxz_stg1_img(void) +{ + int rc; + int inlen; + int xzlen; + void *xzbuf = NULL; + uint8_t *buf = NULL; + + rc = hiperiso_read_file_to_buf(HIPERISO_FILE_STG1_IMG, 0, &xzbuf, &xzlen); + vdebug("read core.img.xz rc:%d len:%d\n", rc, xzlen); + + if (g_grub_stg1_raw_img) + { + buf = g_grub_stg1_raw_img; + } + else + { + buf = zalloc(SIZE_1MB); + if (!buf) + { + check_free(xzbuf); + return 1; + } + } + + rc = unxz(xzbuf, xzlen, NULL, NULL, buf, &inlen, NULL); + vdebug("hiperiso_unxz_stg1_img len:%d rc:%d\n", inlen, rc); + + g_grub_stg1_raw_img = buf; + + check_free(xzbuf); + return 0; +} + + +static int hiperiso_http_save_cfg(void) +{ + FILE *fp; + + fp = fopen(g_ini_file, "w"); + if (!fp) + { + vlog("Failed to open %s code:%d\n", g_ini_file, errno); + return 0; + } + + fprintf(fp, "[Hiperiso]\nLanguage=%s\nPartStyle=%d\nShowAllDevice=%d\n", + g_cur_language, g_cur_part_style, g_cur_show_all); + + fclose(fp); + return 0; +} + +static int hiperiso_http_load_cfg(void) +{ + int i; + int len; + char line[256]; + FILE *fp; + + fp = fopen(g_ini_file, "r"); + if (!fp) + { + return 0; + } + + while (fgets(line, sizeof(line), fp)) + { + len = (int)strlen(line); + for (i = len - 1; i >= 0; i--) + { + if (line[i] == ' ' || line[i] == '\t' || line[i] == '\r' || line[i] == '\n') + { + line[i] = 0; + } + else + { + break; + } + } + + len = (int)strlen("Language="); + if (strncmp(line, "Language=", len) == 0) + { + scnprintf(g_cur_language, "%s", line + len); + } + else if (strncmp(line, "PartStyle=", strlen("PartStyle=")) == 0) + { + g_cur_part_style = (int)strtol(line + strlen("PartStyle="), NULL, 10); + } + else if (strncmp(line, "ShowAllDevice=", strlen("ShowAllDevice=")) == 0) + { + g_cur_show_all = (int)strtol(line + strlen("ShowAllDevice="), NULL, 10); + } + } + + fclose(fp); + return 0; +} + + +static int hiperiso_json_result(struct mg_connection *conn, const char *err) +{ + if (conn) + { + mg_printf(conn, + "HTTP/1.1 200 OK \r\n" + "Content-Type: application/json\r\n" + "Content-Length: %d\r\n" + "\r\n%s", + (int)strlen(err), err); + } + else + { + memcpy(g_pub_out_buf, err, (int)strlen(err) + 1); + } + + return 0; +} + +static int hiperiso_json_buffer(struct mg_connection *conn, const char *json_buf, int json_len) +{ + if (conn) + { + mg_printf(conn, + "HTTP/1.1 200 OK \r\n" + "Content-Type: application/json\r\n" + "Content-Length: %d\r\n" + "\r\n%s", + json_len, json_buf); + } + else + { + if (json_len >= g_pub_out_max) + { + vlog("json buffer overflow\n"); + } + else + { + memcpy(g_pub_out_buf, json_buf, json_len); + g_pub_out_buf[json_len] = 0; + } + } + + return 0; +} + +static int hiperiso_api_sysinfo(struct mg_connection *conn, HISO_JSON *json) +{ + int busy = 0; + int pos = 0; + int buflen = 0; + char buf[512]; + + (void)json; + + busy = (g_current_progress == PT_FINISH) ? 0 : 1; + + buflen = sizeof(buf) - 1; + HISO_JSON_FMT_BEGIN(pos, buf, buflen); + HISO_JSON_FMT_OBJ_BEGIN(); + HISO_JSON_FMT_STRN("token", g_cur_server_token); + HISO_JSON_FMT_STRN("language", g_cur_language); + HISO_JSON_FMT_STRN("hiperiso_ver", hiperiso_get_local_version()); + HISO_JSON_FMT_UINT("partstyle", g_cur_part_style); + HISO_JSON_FMT_BOOL("busy", busy); + HISO_JSON_FMT_STRN("process_disk", g_cur_process_diskname); + HISO_JSON_FMT_STRN("process_type", g_cur_process_type); + HISO_JSON_FMT_OBJ_END(); + HISO_JSON_FMT_END(pos); + + hiperiso_json_buffer(conn, buf, pos); + return 0; +} + +static int hiperiso_api_get_percent(struct mg_connection *conn, HISO_JSON *json) +{ + int pos = 0; + int buflen = 0; + int percent = 0; + char buf[128]; + + (void)json; + + percent = g_current_progress * 100 / PT_FINISH; + + buflen = sizeof(buf) - 1; + HISO_JSON_FMT_BEGIN(pos, buf, buflen); + HISO_JSON_FMT_OBJ_BEGIN(); + HISO_JSON_FMT_STRN("result", g_cur_process_result ? "failed" : "success"); + HISO_JSON_FMT_STRN("process_disk", g_cur_process_diskname); + HISO_JSON_FMT_STRN("process_type", g_cur_process_type); + HISO_JSON_FMT_UINT("percent", percent); + HISO_JSON_FMT_OBJ_END(); + HISO_JSON_FMT_END(pos); + + hiperiso_json_buffer(conn, buf, pos); + return 0; +} + +static int hiperiso_api_set_language(struct mg_connection *conn, HISO_JSON *json) +{ + const char *lang = NULL; + + lang = hiso_json_get_string_ex(json, "language"); + if (lang) + { + scnprintf(g_cur_language, "%s", lang); + hiperiso_http_save_cfg(); + } + + hiperiso_json_result(conn, HISO_JSON_SUCCESS_RET); + return 0; +} + +static int hiperiso_api_set_partstyle(struct mg_connection *conn, HISO_JSON *json) +{ + int ret; + int style = 0; + + ret = hiso_json_get_int(json, "partstyle", &style); + if (JSON_SUCCESS == ret) + { + if ((style == 0) || (style == 1)) + { + g_cur_part_style = style; + hiperiso_http_save_cfg(); + } + } + + hiperiso_json_result(conn, HISO_JSON_SUCCESS_RET); + return 0; +} + +static int hiperiso_clean_disk(int fd, uint64_t size) +{ + int zerolen; + ssize_t len; + off_t offset; + void *buf = NULL; + + vdebug("hiperiso_clean_disk fd:%d size:%llu\n", fd, (_ull)size); + + zerolen = 64 * 1024; + buf = zalloc(zerolen); + if (!buf) + { + vlog("failed to alloc clean buffer\n"); + return 1; + } + + offset = lseek(fd, 0, SEEK_SET); + len = write(fd, buf, zerolen); + vdebug("write disk at off:%llu writelen:%lld datalen:%d\n", (_ull)offset, (_ll)len, zerolen); + + offset = lseek(fd, size - zerolen, SEEK_SET); + len = write(fd, buf, zerolen); + vdebug("write disk at off:%llu writelen:%lld datalen:%d\n", (_ull)offset, (_ll)len, zerolen); + + fsync(fd); + + free(buf); + return 0; +} + +static int hiperiso_write_legacy_grub(int fd, int partstyle) +{ + ssize_t len; + off_t offset; + + if (partstyle) + { + vlog("Write GPT stage1 ...\n"); + + offset = lseek(fd, 512 * 34, SEEK_SET); + + g_grub_stg1_raw_img[500] = 35;//update blocklist + len = write(fd, g_grub_stg1_raw_img, SIZE_1MB - 512 * 34); + + vlog("lseek offset:%llu(%u) writelen:%llu(%u)\n", (_ull)offset, 512 * 34, (_ull)len, SIZE_1MB - 512 * 34); + if (SIZE_1MB - 512 * 34 != len) + { + vlog("write length error\n"); + return 1; + } + } + else + { + vlog("Write MBR stage1 ...\n"); + offset = lseek(fd, 512, SEEK_SET); + len = write(fd, g_grub_stg1_raw_img, SIZE_1MB - 512); + + vlog("lseek offset:%llu(%u) writelen:%llu(%u)\n", (_ull)offset, 512, (_ull)len, SIZE_1MB - 512); + if (SIZE_1MB - 512 != len) + { + vlog("write length error\n"); + return 1; + } + } + + return 0; +} + +static int HiperisoFatMemRead(uint32 Sector, uint8 *Buffer, uint32 SectorCount) +{ + uint32 i; + uint32 offset; + + for (i = 0; i < SectorCount; i++) + { + offset = (Sector + i) * 512; + memcpy(Buffer + i * 512, g_efi_part_raw_img + offset, 512); + } + + return 1; +} + +static int HiperisoFatMemWrite(uint32 Sector, uint8 *Buffer, uint32 SectorCount) +{ + uint32 i; + uint32 offset; + + for (i = 0; i < SectorCount; i++) + { + offset = (Sector + i) * 512; + memcpy(g_efi_part_raw_img + offset, Buffer + i * 512, 512); + } + + return 1; +} + +static int HiperisoProcSecureBoot(int SecureBoot) +{ + int rc = 0; + int size; + char *filebuf = NULL; + void *file = NULL; + + vlog("HiperisoProcSecureBoot %d ...\n", SecureBoot); + + if (SecureBoot) + { + vlog("Secure boot is enabled ...\n"); + return 0; + } + + fl_init(); + + if (0 == fl_attach_media(HiperisoFatMemRead, HiperisoFatMemWrite)) + { + file = fl_fopen("/EFI/BOOT/grubx64_real.efi", "rb"); + vlog("Open hiperiso efi file %p \n", file); + if (file) + { + fl_fseek(file, 0, SEEK_END); + size = (int)fl_ftell(file); + fl_fseek(file, 0, SEEK_SET); + + vlog("hiperiso efi file size %d ...\n", size); + + filebuf = (char *)malloc(size); + if (filebuf) + { + fl_fread(filebuf, 1, size, file); + } + + fl_fclose(file); + + vlog("Now delete all efi files ...\n"); + fl_remove("/EFI/BOOT/BOOTX64.EFI"); + fl_remove("/EFI/BOOT/grubx64.efi"); + fl_remove("/EFI/BOOT/grubx64_real.efi"); + fl_remove("/EFI/BOOT/MokManager.efi"); + fl_remove("/EFI/BOOT/mmx64.efi"); + fl_remove("/ENROLL_THIS_KEY_IN_MOKMANAGER.cer"); + + file = fl_fopen("/EFI/BOOT/BOOTX64.EFI", "wb"); + vlog("Open bootx64 efi file %p \n", file); + if (file) + { + if (filebuf) + { + fl_fwrite(filebuf, 1, size, file); + } + + fl_fflush(file); + fl_fclose(file); + } + + if (filebuf) + { + free(filebuf); + } + } + + file = fl_fopen("/EFI/BOOT/grubia32_real.efi", "rb"); + vlog("Open hiperiso efi file %p\n", file); + if (file) + { + fl_fseek(file, 0, SEEK_END); + size = (int)fl_ftell(file); + fl_fseek(file, 0, SEEK_SET); + + vlog("hiperiso efi file size %d ...\n", size); + + filebuf = (char *)malloc(size); + if (filebuf) + { + fl_fread(filebuf, 1, size, file); + } + + fl_fclose(file); + + vlog("Now delete all efi files ...\n"); + fl_remove("/EFI/BOOT/BOOTIA32.EFI"); + fl_remove("/EFI/BOOT/grubia32.efi"); + fl_remove("/EFI/BOOT/grubia32_real.efi"); + fl_remove("/EFI/BOOT/mmia32.efi"); + + file = fl_fopen("/EFI/BOOT/BOOTIA32.EFI", "wb"); + vlog("Open bootia32 efi file %p\n", file); + if (file) + { + if (filebuf) + { + fl_fwrite(filebuf, 1, size, file); + } + + fl_fflush(file); + fl_fclose(file); + } + + if (filebuf) + { + free(filebuf); + } + } + + } + else + { + rc = 1; + } + + fl_shutdown(); + + return rc; +} + +static int hiperiso_check_efi_part_data(int fd, uint64_t offset) +{ + int i; + ssize_t len; + char *buf; + + buf = malloc(SIZE_1MB); + if (!buf) + { + return 0; + } + + lseek(fd, offset, SEEK_SET); + for (i = 0; i < 32; i++) + { + len = read(fd, buf, SIZE_1MB); + if (len != SIZE_1MB || memcmp(buf, g_efi_part_raw_img + i * SIZE_1MB, SIZE_1MB)) + { + vlog("part2 data check failed i=%d len:%llu\n", i, (_ull)len); + return 1; + } + + g_current_progress = PT_CHECK_PART2 + (i / 4); + } + + return 0; +} + +static int hiperiso_write_efipart(int fd, uint64_t offset, uint32_t secureboot) +{ + int i; + ssize_t len; + + vlog("Formatting part2 EFI offset:%llu ...\n", (_ull)offset); + lseek(fd, offset, SEEK_SET); + + HiperisoProcSecureBoot((int)secureboot); + + g_current_progress = PT_WRITE_HIPERISO_START; + for (i = 0; i < 32; i++) + { + len = write(fd, g_efi_part_raw_img + i * SIZE_1MB, SIZE_1MB); + vlog("write disk writelen:%lld datalen:%d [ %s ]\n", + (_ll)len, SIZE_1MB, (len == SIZE_1MB) ? "success" : "failed"); + + if (len != SIZE_1MB) + { + vlog("failed to format part2 EFI\n"); + return 1; + } + + g_current_progress = PT_WRITE_HIPERISO_START + i / 4; + } + + return 0; +} + +static int HiperisoFillBackupGptHead(HISO_GPT_INFO *pInfo, HISO_GPT_HDR *pHead) +{ + uint64_t LBA; + uint64_t BackupLBA; + + memcpy(pHead, &pInfo->Head, sizeof(HISO_GPT_HDR)); + + LBA = pHead->EfiStartLBA; + BackupLBA = pHead->EfiBackupLBA; + + pHead->EfiStartLBA = BackupLBA; + pHead->EfiBackupLBA = LBA; + pHead->PartTblStartLBA = BackupLBA + 1 - 33; + + pHead->Crc = 0; + pHead->Crc = hiperiso_crc32(pHead, pHead->Length); + + return 0; +} + +static int hiperiso_write_gpt_part_table(int fd, uint64_t disksize, HISO_GPT_INFO *gpt) +{ + ssize_t len; + off_t offset; + HISO_GPT_HDR BackupHead; + + HiperisoFillBackupGptHead(gpt, &BackupHead); + + offset = lseek(fd, disksize - 512, SEEK_SET); + len = write(fd, &BackupHead, sizeof(HISO_GPT_HDR)); + vlog("write backup gpt part table off:%llu len:%llu\n", (_ull)offset, (_ull)len); + if (offset != disksize - 512 || len != sizeof(HISO_GPT_HDR)) + { + return 1; + } + + offset = lseek(fd, disksize - 512 * 33, SEEK_SET); + len = write(fd, gpt->PartTbl, sizeof(gpt->PartTbl)); + vlog("write main gpt part table off:%llu len:%llu\n", (_ull)offset, (_ull)len); + if (offset != disksize - 512 * 33 || len != sizeof(gpt->PartTbl)) + { + return 1; + } + + offset = lseek(fd, 0, SEEK_SET); + len = write(fd, gpt, sizeof(HISO_GPT_INFO)); + vlog("write gpt part head off:%llu len:%llu\n", (_ull)offset, (_ull)len); + if (offset != 0 || len != sizeof(HISO_GPT_INFO)) + { + return 1; + } + + return 0; +} + +static int hiperiso_mbr_need_update(hiperiso_disk *disk, MBR_HEAD *mbr) +{ + int update = 0; + int partition_style; + MBR_HEAD LocalMBR; + + partition_style = disk->hisodata.partition_style; + memcpy(mbr, &(disk->hisodata.gptinfo.MBR), 512); + + HiperisoGetLocalBootImg(&LocalMBR); + memcpy(LocalMBR.BootCode + 0x180, mbr->BootCode + 0x180, 16); + if (partition_style) + { + LocalMBR.BootCode[92] = 0x22; + } + + if (memcmp(LocalMBR.BootCode, mbr->BootCode, 440)) + { + memcpy(mbr->BootCode, LocalMBR.BootCode, 440); + vlog("MBR boot code different, must update it.\n"); + update = 1; + } + + if (partition_style == 0 && mbr->PartTbl[0].Active == 0) + { + mbr->PartTbl[0].Active = 0x80; + mbr->PartTbl[1].Active = 0; + mbr->PartTbl[2].Active = 0; + mbr->PartTbl[3].Active = 0; + vlog("set MBR partition 1 active flag enabled\n"); + update = 1; + } + + return update; +} + +static void * hiperiso_update_thread(void *data) +{ + int fd; + ssize_t len; + off_t offset; + MBR_HEAD MBR; + hiperiso_disk *disk = NULL; + hiperiso_thread_data *thread = (hiperiso_thread_data *)data; + HISO_GPT_INFO *pstGPT = NULL; + + vdebug("hiperiso_update_thread run ...\n"); + + fd = thread->diskfd; + disk = thread->disk; + + g_current_progress = PT_PRAPARE_FOR_CLEAN; + vdebug("check disk %s\n", disk->disk_name); + if (hiperiso_is_disk_mounted(disk->disk_path)) + { + vlog("disk is mounted, now try to unmount it ...\n"); + hiperiso_try_umount_disk(disk->disk_path); + } + + if (hiperiso_is_disk_mounted(disk->disk_path)) + { + vlog("%s is mounted and can't umount!\n", disk->disk_path); + goto err; + } + else + { + vlog("disk is not mounted now, we can do continue ...\n"); + } + + g_current_progress = PT_LOAD_CORE_IMG; + hiperiso_unxz_stg1_img(); + + g_current_progress = PT_LOAD_DISK_IMG; + hiperiso_unxz_efipart_img(); + + g_current_progress = PT_FORMAT_PART2; + + vlog("Formatting part2 EFI ...\n"); + if (0 != hiperiso_write_efipart(fd, disk->hisodata.part2_start_sector * 512, thread->secure_boot)) + { + vlog("Failed to format part2 efi ...\n"); + goto err; + } + + g_current_progress = PT_WRITE_STG1_IMG; + + vlog("Writing legacy grub ...\n"); + if (0 != hiperiso_write_legacy_grub(fd, disk->hisodata.partition_style)) + { + vlog("hiperiso_write_legacy_grub failed ...\n"); + goto err; + } + + offset = lseek(fd, 512 * 2040, SEEK_SET); + len = write(fd, disk->hisodata.rsvdata, sizeof(disk->hisodata.rsvdata)); + vlog("Writing reserve data offset:%llu len:%llu ...\n", (_ull)offset, (_ull)len); + + if (hiperiso_mbr_need_update(disk, &MBR)) + { + offset = lseek(fd, 0, SEEK_SET); + len = write(fd, &MBR, 512); + vlog("update MBR offset:%llu len:%llu\n", (_ull)offset, (_ull)len); + } + else + { + vlog("No need to update MBR\n"); + } + + + if (disk->hisodata.partition_style) + { + pstGPT = (HISO_GPT_INFO *)malloc(sizeof(HISO_GPT_INFO)); + memset(pstGPT, 0, sizeof(HISO_GPT_INFO)); + + offset = lseek(fd, 0, SEEK_SET); + len = read(fd, pstGPT, sizeof(HISO_GPT_INFO)); + vlog("Read GPT table offset:%llu len:%llu ...\n", (_ull)offset, (_ull)len); + + if (pstGPT->PartTbl[1].Attr != 0x8000000000000000ULL) + { + vlog("Update EFI part attr from 0x%016llx to 0x%016llx\n", + pstGPT->PartTbl[1].Attr, 0x8000000000000000ULL); + + pstGPT->PartTbl[1].Attr = 0x8000000000000000ULL; + + pstGPT->Head.PartTblCrc = hiperiso_crc32(pstGPT->PartTbl, sizeof(pstGPT->PartTbl)); + pstGPT->Head.Crc = 0; + pstGPT->Head.Crc = hiperiso_crc32(&(pstGPT->Head), pstGPT->Head.Length); + hiperiso_write_gpt_part_table(fd, disk->size_in_byte, pstGPT); + } + else + { + vlog("No need to update EFI part attr\n"); + } + free(pstGPT); + } + + + g_current_progress = PT_SYNC_DATA1; + + vlog("fsync data1...\n"); + fsync(fd); + hiso_safe_close_fd(fd); + + g_current_progress = PT_SYNC_DATA2; + + vlog("====================================\n"); + vlog("====== hiperiso update success ======\n"); + vlog("====================================\n"); + goto end; + +err: + g_cur_process_result = 1; + hiso_safe_close_fd(fd); + +end: + g_current_progress = PT_FINISH; + + check_free(thread); + + return NULL; +} + +static void * hiperiso_install_thread(void *data) +{ + int fd; + ssize_t len; + off_t offset; + MBR_HEAD MBR; + hiperiso_disk *disk = NULL; + HISO_GPT_INFO *gpt = NULL; + hiperiso_thread_data *thread = (hiperiso_thread_data *)data; + uint64_t Part1StartSector = 0; + uint64_t Part1SectorCount = 0; + uint64_t Part2StartSector = 0; + + vdebug("hiperiso_install_thread run ...\n"); + + fd = thread->diskfd; + disk = thread->disk; + + g_current_progress = PT_PRAPARE_FOR_CLEAN; + vdebug("check disk %s\n", disk->disk_name); + if (hiperiso_is_disk_mounted(disk->disk_path)) + { + vlog("disk is mounted, now try to unmount it ...\n"); + hiperiso_try_umount_disk(disk->disk_path); + } + + if (hiperiso_is_disk_mounted(disk->disk_path)) + { + vlog("%s is mounted and can't umount!\n", disk->disk_path); + goto err; + } + else + { + vlog("disk is not mounted now, we can do continue ...\n"); + } + + g_current_progress = PT_DEL_ALL_PART; + hiperiso_clean_disk(fd, disk->size_in_byte); + + g_current_progress = PT_LOAD_CORE_IMG; + hiperiso_unxz_stg1_img(); + + g_current_progress = PT_LOAD_DISK_IMG; + hiperiso_unxz_efipart_img(); + + if (thread->partstyle) + { + vdebug("Fill GPT part table\n"); + gpt = zalloc(sizeof(HISO_GPT_INFO)); + hiperiso_fill_gpt(disk->size_in_byte, thread->reserveBytes, thread->align4kb, gpt); + Part1StartSector = gpt->PartTbl[0].StartLBA; + Part1SectorCount = gpt->PartTbl[0].LastLBA - Part1StartSector + 1; + Part2StartSector = gpt->PartTbl[1].StartLBA; + } + else + { + vdebug("Fill MBR part table\n"); + hiperiso_fill_mbr(disk->size_in_byte, thread->reserveBytes, thread->align4kb, &MBR); + Part1StartSector = MBR.PartTbl[0].StartSectorId; + Part1SectorCount = MBR.PartTbl[0].SectorCount; + Part2StartSector = MBR.PartTbl[1].StartSectorId; + } + + vlog("Part1StartSector:%llu Part1SectorCount:%llu Part2StartSector:%llu\n", + (_ull)Part1StartSector, (_ull)Part1SectorCount, (_ull)Part2StartSector); + + if (thread->partstyle != disk->partstyle) + { + vlog("Wait for format part1 (partstyle changed) ...\n"); + sleep(1); + } + + g_current_progress = PT_FORMAT_PART1; + vlog("Formatting part1 exFAT %s ...\n", disk->disk_path); + if (0 != mkexfat_main(disk->disk_path, fd, Part1SectorCount)) + { + vlog("Failed to format exfat ...\n"); + goto err; + } + + g_current_progress = PT_FORMAT_PART2; + vlog("Formatting part2 EFI ...\n"); + if (0 != hiperiso_write_efipart(fd, Part2StartSector * 512, thread->secure_boot)) + { + vlog("Failed to format part2 efi ...\n"); + goto err; + } + + g_current_progress = PT_WRITE_STG1_IMG; + vlog("Writing legacy grub ...\n"); + if (0 != hiperiso_write_legacy_grub(fd, thread->partstyle)) + { + vlog("hiperiso_write_legacy_grub failed ...\n"); + goto err; + } + + g_current_progress = PT_SYNC_DATA1; + vlog("fsync data1...\n"); + fsync(fd); + hiso_safe_close_fd(fd); + + /* reopen for check part2 data */ + vlog("Checking part2 efi data %s ...\n", disk->disk_path); + g_current_progress = PT_CHECK_PART2; + fd = open(disk->disk_path, O_RDONLY | O_BINARY); + if (fd < 0) + { + vlog("failed to open %s for check fd:%d err:%d\n", disk->disk_path, fd, errno); + goto err; + } + + if (0 == hiperiso_check_efi_part_data(fd, Part2StartSector * 512)) + { + vlog("efi part data check success\n"); + } + else + { + vlog("efi part data check failed\n"); + goto err; + } + + hiso_safe_close_fd(fd); + + /* reopen for write part table */ + g_current_progress = PT_WRITE_PART_TABLE; + vlog("Writting Partition Table style:%d...\n", thread->partstyle); + + fd = open(disk->disk_path, O_RDWR | O_BINARY); + if (fd < 0) + { + vlog("failed to open %s for part table fd:%d err:%d\n", disk->disk_path, fd, errno); + goto err; + } + + if (thread->partstyle) + { + hiperiso_write_gpt_part_table(fd, disk->size_in_byte, gpt); + } + else + { + offset = lseek(fd, 0, SEEK_SET); + len = write(fd, &MBR, 512); + vlog("Writting MBR Partition Table %llu %llu\n", (_ull)offset, (_ull)len); + if (offset != 0 || len != 512) + { + goto err; + } + } + + g_current_progress = PT_SYNC_DATA2; + vlog("fsync data2...\n"); + fsync(fd); + hiso_safe_close_fd(fd); + + + vlog("====================================\n"); + vlog("====== hiperiso install success ======\n"); + vlog("====================================\n"); + goto end; + +err: + g_cur_process_result = 1; + hiso_safe_close_fd(fd); + +end: + g_current_progress = PT_FINISH; + + check_free(gpt); + check_free(thread); + + return NULL; +} + +static int hiperiso_api_clean(struct mg_connection *conn, HISO_JSON *json) +{ + int i = 0; + int fd = 0; + hiperiso_disk *disk = NULL; + const char *diskname = NULL; + char path[128]; + + if (g_current_progress != PT_FINISH) + { + hiperiso_json_result(conn, HISO_JSON_BUSY_RET); + return 0; + } + + diskname = hiso_json_get_string_ex(json, "disk"); + if (diskname == NULL) + { + hiperiso_json_result(conn, HISO_JSON_INVALID_RET); + return 0; + } + + for (i = 0; i < g_disk_num; i++) + { + if (strcmp(g_disk_list[i].disk_name, diskname) == 0) + { + disk = g_disk_list + i; + break; + } + } + + if (disk == NULL) + { + vlog("disk %s not found\n", diskname); + hiperiso_json_result(conn, HISO_JSON_NOTFOUND_RET); + return 0; + } + + scnprintf(path, "/sys/block/%s", diskname); + if (access(path, F_OK) < 0) + { + vlog("File %s not exist anymore\n", path); + hiperiso_json_result(conn, HISO_JSON_NOTFOUND_RET); + return 0; + } + + vlog("==================================\n"); + vlog("===== hiperiso clean %s =====\n", disk->disk_path); + vlog("==================================\n"); + + if (hiperiso_is_disk_mounted(disk->disk_path)) + { + vlog("disk is mounted, now try to unmount it ...\n"); + hiperiso_try_umount_disk(disk->disk_path); + } + + if (hiperiso_is_disk_mounted(disk->disk_path)) + { + vlog("%s is mounted and can't umount!\n", disk->disk_path); + hiperiso_json_result(conn, HISO_JSON_FAILED_RET); + return 0; + } + else + { + vlog("disk is not mounted now, we can do the clean ...\n"); + } + + fd = open(disk->disk_path, O_RDWR | O_BINARY); + if (fd < 0) + { + vlog("failed to open %s fd:%d err:%d\n", disk->disk_path, fd, errno); + hiperiso_json_result(conn, HISO_JSON_FAILED_RET); + return 0; + } + + vdebug("start clean %s ...\n", disk->disk_model); + hiperiso_clean_disk(fd, disk->size_in_byte); + + hiso_safe_close_fd(fd); + + hiperiso_json_result(conn, HISO_JSON_SUCCESS_RET); + return 0; +} + +static int hiperiso_api_install(struct mg_connection *conn, HISO_JSON *json) +{ + int i = 0; + int ret = 0; + int fd = 0; + uint32_t align4kb = 0; + uint32_t style = 0; + uint32_t secure_boot = 0; + uint64_t reserveBytes = 0; + hiperiso_disk *disk = NULL; + const char *diskname = NULL; + const char *reserve_space = NULL; + hiperiso_thread_data *thread = NULL; + char path[128]; + + if (g_current_progress != PT_FINISH) + { + hiperiso_json_result(conn, HISO_JSON_BUSY_RET); + return 0; + } + + diskname = hiso_json_get_string_ex(json, "disk"); + reserve_space = hiso_json_get_string_ex(json, "reserve_space"); + ret += hiso_json_get_uint(json, "partstyle", &style); + ret += hiso_json_get_uint(json, "secure_boot", &secure_boot); + ret += hiso_json_get_uint(json, "align_4kb", &align4kb); + + if (diskname == NULL || reserve_space == NULL || ret != JSON_SUCCESS) + { + hiperiso_json_result(conn, HISO_JSON_INVALID_RET); + return 0; + } + + reserveBytes = (uint64_t)strtoull(reserve_space, NULL, 10); + + for (i = 0; i < g_disk_num; i++) + { + if (strcmp(g_disk_list[i].disk_name, diskname) == 0) + { + disk = g_disk_list + i; + break; + } + } + + if (disk == NULL) + { + vlog("disk %s not found\n", diskname); + hiperiso_json_result(conn, HISO_JSON_NOTFOUND_RET); + return 0; + } + + if (disk->is4kn) + { + vlog("disk %s is 4k native, not supported.\n", diskname); + hiperiso_json_result(conn, HISO_JSON_4KN_RET); + return 0; + } + + scnprintf(path, "/sys/block/%s", diskname); + if (access(path, F_OK) < 0) + { + vlog("File %s not exist anymore\n", path); + hiperiso_json_result(conn, HISO_JSON_NOTFOUND_RET); + return 0; + } + + if (disk->size_in_byte > 2199023255552ULL && style == 0) + { + vlog("disk %s is more than 2TB and GPT is needed\n", path); + hiperiso_json_result(conn, HISO_JSON_MBR_2TB_RET); + return 0; + } + + if ((reserveBytes + HISOEFI_PART_BYTES * 2) > disk->size_in_byte) + { + vlog("reserve space %llu is too big for disk %s %llu\n", (_ull)reserveBytes, path, (_ull)disk->size_in_byte); + hiperiso_json_result(conn, HISO_JSON_INVALID_RSV_RET); + return 0; + } + + vlog("==================================================================================\n"); + vlog("===== hiperiso install %s style:%s secureboot:%u align4K:%u reserve:%llu =========\n", + disk->disk_path, (style ? "GPT" : "MBR"), secure_boot, align4kb, (_ull)reserveBytes); + vlog("==================================================================================\n"); + + if (hiperiso_is_disk_mounted(disk->disk_path)) + { + vlog("disk is mounted, now try to unmount it ...\n"); + hiperiso_try_umount_disk(disk->disk_path); + } + + if (hiperiso_is_disk_mounted(disk->disk_path)) + { + vlog("%s is mounted and can't umount!\n", disk->disk_path); + hiperiso_json_result(conn, HISO_JSON_FAILED_RET); + return 0; + } + else + { + vlog("disk is not mounted now, we can do the install ...\n"); + } + + fd = open(disk->disk_path, O_RDWR | O_BINARY); + if (fd < 0) + { + vlog("failed to open %s fd:%d err:%d\n", disk->disk_path, fd, errno); + hiperiso_json_result(conn, HISO_JSON_FAILED_RET); + return 0; + } + + vdebug("start install thread %s ...\n", disk->disk_model); + thread = zalloc(sizeof(hiperiso_thread_data)); + if (!thread) + { + hiso_safe_close_fd(fd); + vlog("failed to alloc thread data err:%d\n", errno); + hiperiso_json_result(conn, HISO_JSON_FAILED_RET); + return 0; + } + + g_current_progress = PT_START; + g_cur_process_result = 0; + scnprintf(g_cur_process_type, "%s", "install"); + scnprintf(g_cur_process_diskname, "%s", disk->disk_name); + + thread->disk = disk; + thread->diskfd = fd; + thread->align4kb = align4kb; + thread->partstyle = style; + thread->secure_boot = secure_boot; + thread->reserveBytes = reserveBytes; + + mg_start_thread(hiperiso_install_thread, thread); + + hiperiso_json_result(conn, HISO_JSON_SUCCESS_RET); + return 0; +} + +static int hiperiso_api_update(struct mg_connection *conn, HISO_JSON *json) +{ + int i = 0; + int ret = 0; + int fd = 0; + uint32_t secure_boot = 0; + hiperiso_disk *disk = NULL; + const char *diskname = NULL; + hiperiso_thread_data *thread = NULL; + char path[128]; + + if (g_current_progress != PT_FINISH) + { + hiperiso_json_result(conn, HISO_JSON_BUSY_RET); + return 0; + } + + diskname = hiso_json_get_string_ex(json, "disk"); + ret += hiso_json_get_uint(json, "secure_boot", &secure_boot); + if (diskname == NULL || ret != JSON_SUCCESS) + { + hiperiso_json_result(conn, HISO_JSON_INVALID_RET); + return 0; + } + + for (i = 0; i < g_disk_num; i++) + { + if (strcmp(g_disk_list[i].disk_name, diskname) == 0) + { + disk = g_disk_list + i; + break; + } + } + + if (disk == NULL) + { + vlog("disk %s not found\n", diskname); + hiperiso_json_result(conn, HISO_JSON_NOTFOUND_RET); + return 0; + } + + if (disk->hisodata.hiperiso_valid == 0) + { + vlog("disk %s is not hiperiso disk\n", diskname); + hiperiso_json_result(conn, HISO_JSON_FAILED_RET); + return 0; + } + + scnprintf(path, "/sys/block/%s", diskname); + if (access(path, F_OK) < 0) + { + vlog("File %s not exist anymore\n", path); + hiperiso_json_result(conn, HISO_JSON_NOTFOUND_RET); + return 0; + } + + vlog("==========================================================\n"); + vlog("===== hiperiso update %s new_secureboot:%u =========\n", disk->disk_path, secure_boot); + vlog("==========================================================\n"); + + vlog("%s version:%s partstyle:%u oldsecureboot:%u reserve:%llu\n", + disk->disk_path, disk->hisodata.hiperiso_ver, + disk->hisodata.partition_style, + disk->hisodata.secure_boot_flag, + (_ull)(disk->hisodata.preserved_space) + ); + + if (hiperiso_is_disk_mounted(disk->disk_path)) + { + vlog("disk is mounted, now try to unmount it ...\n"); + hiperiso_try_umount_disk(disk->disk_path); + } + + if (hiperiso_is_disk_mounted(disk->disk_path)) + { + vlog("%s is mounted and can't umount!\n", disk->disk_path); + hiperiso_json_result(conn, HISO_JSON_FAILED_RET); + return 0; + } + else + { + vlog("disk is not mounted now, we can do the update ...\n"); + } + + fd = open(disk->disk_path, O_RDWR | O_BINARY); + if (fd < 0) + { + vlog("failed to open %s fd:%d err:%d\n", disk->disk_path, fd, errno); + hiperiso_json_result(conn, HISO_JSON_FAILED_RET); + return 0; + } + + vdebug("start update thread %s ...\n", disk->disk_model); + thread = zalloc(sizeof(hiperiso_thread_data)); + if (!thread) + { + hiso_safe_close_fd(fd); + vlog("failed to alloc thread data err:%d\n", errno); + hiperiso_json_result(conn, HISO_JSON_FAILED_RET); + return 0; + } + + g_current_progress = PT_START; + g_cur_process_result = 0; + scnprintf(g_cur_process_type, "%s", "update"); + scnprintf(g_cur_process_diskname, "%s", disk->disk_name); + + thread->disk = disk; + thread->diskfd = fd; + thread->secure_boot = secure_boot; + + mg_start_thread(hiperiso_update_thread, thread); + + hiperiso_json_result(conn, HISO_JSON_SUCCESS_RET); + return 0; +} + + +static int hiperiso_api_refresh_device(struct mg_connection *conn, HISO_JSON *json) +{ + (void)json; + + if (g_current_progress == PT_FINISH) + { + g_disk_num = 0; + hiperiso_disk_enumerate_all(); + } + + hiperiso_json_result(conn, HISO_JSON_SUCCESS_RET); + return 0; +} + +static int hiperiso_api_get_dev_list(struct mg_connection *conn, HISO_JSON *json) +{ + int i = 0; + int rc = 0; + int pos = 0; + int buflen = 0; + uint32_t alldev = 0; + char *buf = NULL; + hiperiso_disk *cur = NULL; + + rc = hiso_json_get_uint(json, "alldev", &alldev); + if (JSON_SUCCESS != rc) + { + alldev = 0; + } + + buflen = g_disk_num * 1024; + buf = (char *)malloc(buflen + 1024); + if (!buf) + { + hiperiso_json_result(conn, HISO_JSON_FAILED_RET); + return 0; + } + + HISO_JSON_FMT_BEGIN(pos, buf, buflen); + HISO_JSON_FMT_OBJ_BEGIN(); + HISO_JSON_FMT_KEY("list"); + HISO_JSON_FMT_ARY_BEGIN(); + + for (i = 0; i < g_disk_num; i++) + { + cur = g_disk_list + i; + + if (alldev == 0 && cur->type != HISO_DEVICE_USB) + { + continue; + } + + HISO_JSON_FMT_OBJ_BEGIN(); + HISO_JSON_FMT_STRN("name", cur->disk_name); + HISO_JSON_FMT_STRN("model", cur->disk_model); + HISO_JSON_FMT_STRN("size", cur->human_readable_size); + HISO_JSON_FMT_UINT("hiso_valid", cur->hisodata.hiperiso_valid); + HISO_JSON_FMT_STRN("hiso_ver", cur->hisodata.hiperiso_ver); + HISO_JSON_FMT_UINT("hiso_secure_boot", cur->hisodata.secure_boot_flag); + HISO_JSON_FMT_UINT("hiso_partstyle", cur->hisodata.partition_style); + HISO_JSON_FMT_OBJ_ENDEX(); + } + + HISO_JSON_FMT_ARY_END(); + HISO_JSON_FMT_OBJ_END(); + HISO_JSON_FMT_END(pos); + + hiperiso_json_buffer(conn, buf, pos); + return 0; +} + +static JSON_CB g_hiperiso_json_cb[] = +{ + { "sysinfo", hiperiso_api_sysinfo }, + { "sel_language", hiperiso_api_set_language }, + { "sel_partstyle", hiperiso_api_set_partstyle }, + { "refresh_device", hiperiso_api_refresh_device }, + { "get_dev_list", hiperiso_api_get_dev_list }, + { "install", hiperiso_api_install }, + { "update", hiperiso_api_update }, + { "clean", hiperiso_api_clean }, + { "get_percent", hiperiso_api_get_percent }, +}; + +static int hiperiso_json_handler(struct mg_connection *conn, HISO_JSON *json) +{ + int i; + const char *token = NULL; + const char *method = NULL; + + method = hiso_json_get_string_ex(json, "method"); + if (!method) + { + hiperiso_json_result(conn, HISO_JSON_SUCCESS_RET); + return 0; + } + + if (strcmp(method, "sysinfo")) + { + token = hiso_json_get_string_ex(json, "token"); + if (token == NULL || strcmp(token, g_cur_server_token)) + { + hiperiso_json_result(conn, HISO_JSON_TOKEN_ERR_RET); + return 0; + } + } + + for (i = 0; i < (int)(sizeof(g_hiperiso_json_cb) / sizeof(g_hiperiso_json_cb[0])); i++) + { + if (strcmp(method, g_hiperiso_json_cb[i].method) == 0) + { + g_hiperiso_json_cb[i].callback(conn, json); + break; + } + } + + return 0; +} + +int hiperiso_func_handler(const char *jsonstr, char *jsonbuf, int buflen) +{ + int i; + const char *method = NULL; + HISO_JSON *json = NULL; + + g_pub_out_buf = jsonbuf; + g_pub_out_max = buflen; + + json = hiso_json_create(); + if (JSON_SUCCESS == hiso_json_parse(json, jsonstr)) + { + pthread_mutex_lock(&g_api_mutex); + + method = hiso_json_get_string_ex(json->pstChild, "method"); + for (i = 0; i < (int)(sizeof(g_hiperiso_json_cb) / sizeof(g_hiperiso_json_cb[0])); i++) + { + if (method && strcmp(method, g_hiperiso_json_cb[i].method) == 0) + { + g_hiperiso_json_cb[i].callback(NULL, json->pstChild); + break; + } + } + + pthread_mutex_unlock(&g_api_mutex); + } + else + { + hiperiso_json_result(NULL, HISO_JSON_INVALID_RET); + } + + hiso_json_destroy(json); + return 0; +} + +static int hiperiso_request_handler(struct mg_connection *conn) +{ + int post_data_len; + int post_buf_len; + HISO_JSON *json = NULL; + char *post_data_buf = NULL; + const struct mg_request_info *ri = NULL; + char stack_buf[512]; + + ri = mg_get_request_info(conn); + + if (strcmp(ri->uri, "/hiso/json") == 0) + { + if (ri->content_length > 500) + { + post_data_buf = malloc(ri->content_length + 4); + post_buf_len = ri->content_length + 1; + } + else + { + post_data_buf = stack_buf; + post_buf_len = sizeof(stack_buf); + } + + post_data_len = mg_read(conn, post_data_buf, post_buf_len); + post_data_buf[post_data_len] = 0; + + json = hiso_json_create(); + if (JSON_SUCCESS == hiso_json_parse(json, post_data_buf)) + { + pthread_mutex_lock(&g_api_mutex); + hiperiso_json_handler(conn, json->pstChild); + pthread_mutex_unlock(&g_api_mutex); + } + else + { + hiperiso_json_result(conn, HISO_JSON_INVALID_RET); + } + + hiso_json_destroy(json); + + if (post_data_buf != stack_buf) + { + free(post_data_buf); + } + return 1; + } + else + { + return 0; + } +} + +int hiperiso_http_start(const char *ip, const char *port) +{ + uint8_t uuid[16]; + char addr[128]; + struct mg_callbacks callbacks; + const char *options[] = + { + "listening_ports", "24680", + "document_root", "WebUI", + "error_log_file", g_log_file, + "request_timeout_ms", "10000", + NULL + }; + + /* unique token */ + hiperiso_gen_preudo_uuid(uuid); + scnprintf(g_cur_server_token, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", + uuid[0], uuid[1], uuid[2], uuid[3], uuid[4], uuid[5], uuid[6], uuid[7], + uuid[8], uuid[9], uuid[10], uuid[11], uuid[12], uuid[13], uuid[14], uuid[15]); + + /* option */ + scnprintf(addr, "%s:%s", ip, port); + options[1] = addr; + + memset(&callbacks, 0, sizeof(callbacks)); + callbacks.begin_request = hiperiso_request_handler; + g_hiperiso_http_ctx = mg_start(&callbacks, NULL, options); + + return g_hiperiso_http_ctx ? 0 : 1; +} + +int hiperiso_http_stop(void) +{ + if (g_hiperiso_http_ctx) + { + mg_stop(g_hiperiso_http_ctx); + } + return 0; +} + +int hiperiso_http_init(void) +{ + pthread_mutex_init(&g_api_mutex, NULL); + + hiperiso_http_load_cfg(); + + hiperiso_load_mbr_template(); + + return 0; +} + +void hiperiso_http_exit(void) +{ + pthread_mutex_destroy(&g_api_mutex); + + check_free(g_efi_part_raw_img); + g_efi_part_raw_img = NULL; +} + + +const char * hiperiso_code_get_cur_language(void) +{ + return g_cur_language; +} + +int hiperiso_code_get_cur_part_style(void) +{ + return g_cur_part_style; +} + +void hiperiso_code_set_cur_part_style(int style) +{ + pthread_mutex_lock(&g_api_mutex); + + g_cur_part_style = style; + hiperiso_http_save_cfg(); + + pthread_mutex_unlock(&g_api_mutex); +} + +int hiperiso_code_get_cur_show_all(void) +{ + return g_cur_show_all; +} + +void hiperiso_code_set_cur_show_all(int show_all) +{ + pthread_mutex_lock(&g_api_mutex); + + g_cur_show_all = show_all; + hiperiso_http_save_cfg(); + + pthread_mutex_unlock(&g_api_mutex); +} + +void hiperiso_code_set_cur_language(const char *lang) +{ + pthread_mutex_lock(&g_api_mutex); + + scnprintf(g_cur_language, "%s", lang); + hiperiso_http_save_cfg(); + + pthread_mutex_unlock(&g_api_mutex); +} + +void hiperiso_code_refresh_device(void) +{ + if (g_current_progress == PT_FINISH) + { + g_disk_num = 0; + hiperiso_disk_enumerate_all(); + } +} + +int hiperiso_code_is_busy(void) +{ + return (g_current_progress == PT_FINISH) ? 0 : 1; +} + +int hiperiso_code_get_percent(void) +{ + return g_current_progress * 100 / PT_FINISH; +} + +int hiperiso_code_get_result(void) +{ + return g_cur_process_result; +} + +void hiperiso_code_save_cfg(void) +{ + hiperiso_http_save_cfg(); +} diff --git a/src/gui/Web/hiperiso_http.h b/src/gui/Web/hiperiso_http.h new file mode 100644 index 0000000..7c4a852 --- /dev/null +++ b/src/gui/Web/hiperiso_http.h @@ -0,0 +1,82 @@ +/****************************************************************************** + * hiperiso_http.h + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#ifndef __HIPERISO_HTTP_H__ +#define __HIPERISO_HTTP_H__ + +#include + +typedef enum PROGRESS_POINT +{ + PT_START = 1, + + PT_PRAPARE_FOR_CLEAN, + PT_DEL_ALL_PART, + + PT_LOAD_CORE_IMG, + PT_LOAD_DISK_IMG, + PT_UNXZ_DISK_IMG_FINISH = PT_LOAD_DISK_IMG + 32, + + PT_FORMAT_PART1, //10 + + PT_FORMAT_PART2, + + PT_WRITE_HIPERISO_START, + PT_WRITE_HIPERISO_FINISH = PT_WRITE_HIPERISO_START + 8, + + PT_WRITE_STG1_IMG,//45 + PT_SYNC_DATA1, + + PT_CHECK_PART2, + PT_CHECK_PART2_FINISH = PT_CHECK_PART2 + 8, + + PT_WRITE_PART_TABLE,//52 + PT_SYNC_DATA2, + + PT_FINISH +}PROGRESS_POINT; + +typedef int (*hiperiso_json_callback)(struct mg_connection *conn, HISO_JSON *json); +typedef struct JSON_CB +{ + const char *method; + hiperiso_json_callback callback; +}JSON_CB; + +typedef struct hiperiso_thread_data +{ + int diskfd; + uint32_t align4kb; + uint32_t partstyle; + uint32_t secure_boot; + uint64_t reserveBytes; + hiperiso_disk *disk; +}hiperiso_thread_data; + +extern int g_hiso_exfat_disk_fd; +extern uint64_t g_hiso_exfat_part_size; + +int hiperiso_http_init(void); +void hiperiso_http_exit(void); +int hiperiso_http_start(const char *ip, const char *port); +int hiperiso_http_stop(void); +int mkexfat_main(const char *devpath, int fd, uint64_t part_sector_count); + +#endif /* __HIPERISO_HTTP_H__ */ + diff --git a/src/gui/hiperiso_gui.c b/src/gui/hiperiso_gui.c new file mode 100644 index 0000000..c4f70c2 --- /dev/null +++ b/src/gui/hiperiso_gui.c @@ -0,0 +1,1376 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "hiperiso_json.h" + +#define LIB_FLAG_GTK2 (1 << 0) +#define LIB_FLAG_GTK3 (1 << 1) +#define LIB_FLAG_GTK4 (1 << 2) +#define LIB_FLAG_QT4 (1 << 3) +#define LIB_FLAG_QT5 (1 << 4) +#define LIB_FLAG_QT6 (1 << 5) +#define LIB_FLAG_GLADE2 (1 << 30) + +#define LIB_FLAG_GTK (LIB_FLAG_GTK2 | LIB_FLAG_GTK3 | LIB_FLAG_GTK4) +#define LIB_FLAG_QT (LIB_FLAG_QT4 | LIB_FLAG_QT5 | LIB_FLAG_QT6) + +#define MAX_PARAS 64 +#define MAX_LOG_BUF (1024 * 1024) +#define HISO_GUI_PATH "_hiso_gui_path_=" +#define HISO_ENV_STR "_hiso_env_str_=" +#define LD_CACHE_FILE "/etc/ld.so.cache" +#define INT2STR_YN(a) ((a) == 0 ? "NO" : "YES") + +static int g_xdg_log = 0; +static int g_xdg_ini = 0; +static char g_log_file[PATH_MAX]; +static char g_ini_file[PATH_MAX]; +static char *g_log_buf = NULL; +extern char ** environ; + +#define CACHEMAGIC "ld.so-1.7.0" + +struct file_entry +{ + int flags; /* This is 1 for an ELF library. */ + unsigned int key, value; /* String table indices. */ +}; + +struct cache_file +{ + char magic[sizeof CACHEMAGIC - 1]; + unsigned int nlibs; + struct file_entry libs[0]; +}; + +#define CACHEMAGIC_NEW "glibc-ld.so.cache" +#define CACHE_VERSION "1.1" +#define CACHEMAGIC_VERSION_NEW CACHEMAGIC_NEW CACHE_VERSION + +struct file_entry_new +{ + int32_t flags; /* This is 1 for an ELF library. */ + uint32_t key, value; /* String table indices. */ + uint32_t osversion; /* Required OS version. */ + uint64_t hwcap; /* Hwcap entry. */ +}; + +struct cache_file_new +{ + char magic[sizeof CACHEMAGIC_NEW - 1]; + char version[sizeof CACHE_VERSION - 1]; + uint32_t nlibs; /* Number of entries. */ + uint32_t len_strings; /* Size of string table. */ + uint32_t unused[5]; /* Leave space for future extensions + and align to 8 byte boundary. */ + struct file_entry_new libs[0]; /* Entries describing libraries. */ + /* After this the string table of size len_strings is found. */ +}; + +/* Used to align cache_file_new. */ +#define ALIGN_CACHE(addr) \ +(((addr) + __alignof__ (struct cache_file_new) -1) \ + & (~(__alignof__ (struct cache_file_new) - 1))) + +#define vlog(fmt, args...) hiperiso_syslog(0, fmt, ##args) + +void hiperiso_syslog(int level, const char *Fmt, ...) +{ + int buflen; + char *buf = NULL; + char log[512]; + va_list arg; + time_t stamp; + struct tm ttm; + FILE *fp; + + (void)level; + + time(&stamp); + localtime_r(&stamp, &ttm); + + if (g_log_buf) + { + buf = g_log_buf; + buflen = MAX_LOG_BUF; + } + else + { + buf = log; + buflen = sizeof(log); + } + + va_start(arg, Fmt); + vsnprintf(buf, buflen, Fmt, arg); + va_end(arg); + + fp = fopen(g_log_file, "a+"); + if (fp) + { + fprintf(fp, "[%04u/%02u/%02u %02u:%02u:%02u] %s", + ttm.tm_year + 1900, ttm.tm_mon, ttm.tm_mday, + ttm.tm_hour, ttm.tm_min, ttm.tm_sec, + buf); + fclose(fp); + } + + #if 0 + printf("[%04u/%02u/%02u %02u:%02u:%02u] %s", + ttm.tm_year + 1900, ttm.tm_mon, ttm.tm_mday, + ttm.tm_hour, ttm.tm_min, ttm.tm_sec, + buf); + #endif +} + +static int is_gtk_env(void) +{ + const char *env = NULL; + + env = getenv("GNOME_SETUP_DISPLAY"); + if (env && env[0] == ':') + { + vlog("GNOME_SETUP_DISPLAY=%s\n", env); + return 1; + } + + env = getenv("DESKTOP_SESSION"); + if (env && strcasecmp(env, "xfce") == 0) + { + vlog("DESKTOP_SESSION=%s\n", env); + return 1; + } + + return 0; +} + +static int is_qt_env(void) +{ + return 0; +} + +static int detect_gtk_version(int libflag) +{ + int gtk2; + int gtk3; + int gtk4; + int glade2; + + gtk2 = libflag & LIB_FLAG_GTK2; + gtk3 = libflag & LIB_FLAG_GTK3; + gtk4 = libflag & LIB_FLAG_GTK4; + glade2 = libflag & LIB_FLAG_GLADE2; + + if (gtk2 > 0 && glade2 > 0 && (gtk3 == 0 && gtk4 == 0)) + { + return 2; + } + + if (gtk3 > 0 && (gtk2 == 0 && gtk4 == 0)) + { + return 3; + } + + if (gtk4 > 0 && (gtk2 == 0 && gtk3 == 0)) + { + return 4; + } + + if (gtk3 > 0) + { + return 3; + } + + if (gtk4 > 0) + { + return 4; + } + + if (gtk2 > 0 && glade2 > 0) + { + return 2; + } + + return 0; +} + +static int detect_qt_version(int libflag) +{ + int qt4; + int qt5; + int qt6; + + qt4 = libflag & LIB_FLAG_QT4; + qt5 = libflag & LIB_FLAG_QT5; + qt6 = libflag & LIB_FLAG_QT6; + + if (qt4 > 0 && (qt5 == 0 && qt6 == 0)) + { + return 4; + } + + if (qt5 > 0 && (qt4 == 0 && qt6 == 0)) + { + return 5; + } + + if (qt6 > 0 && (qt4 == 0 && qt5 == 0)) + { + return 6; + } + + if (qt5 > 0) + { + return 5; + } + + if (qt6 > 0) + { + return 6; + } + + if (qt4 > 0) + { + return 4; + } + + return 0; +} + +int bit_from_machine(const char *machine) +{ + if (strstr(machine, "64")) + { + return 64; + } + else + { + return 32; + } +} + +int get_os_bit(int *bit) +{ + int ret; + struct utsname unameData; + + memset(&unameData, 0, sizeof(unameData)); + ret = uname(&unameData); + if (ret != 0) + { + vlog("uname error, code: %d\n", errno); + return 1; + } + + *bit = strstr(unameData.machine, "64") ? 64 : 32; + vlog("uname -m <%s> %dbit\n", unameData.machine, *bit); + + return 0; +} + +int read_file_1st_line(const char *file, char *buffer, int buflen) +{ + FILE *fp = NULL; + + fp = fopen(file, "r"); + if (fp == NULL) + { + vlog("Failed to open file %s code:%d", file, errno); + return 1; + } + + fgets(buffer, buflen, fp); + fclose(fp); + return 0; +} + +static int read_pid_cmdline(long pid, char *Buffer, int BufLen) +{ + char path[256]; + + snprintf(path, sizeof(path), "/proc/%ld/cmdline", pid); + return read_file_1st_line(path, Buffer, BufLen); +} + +static int is_dir_exist(const char *fmt, ...) +{ + va_list arg; + struct stat st; + char path[4096]; + + va_start(arg, fmt); + vsnprintf(path, sizeof(path), fmt, arg); + va_end(arg); + + memset(&st, 0, sizeof(st)); + if (stat(path, &st) < 0) + { + return 0; + } + + if (st.st_mode & S_IFDIR) + { + return 1; + } + + return 0; +} + +static void touch_new_file(char *filename) +{ + char *pos = NULL; + FILE *fp = NULL; + + if (access(filename, F_OK) == -1) + { + for (pos = filename; *pos; pos++) + { + if (*pos == '/') + { + *pos = 0; + if (!is_dir_exist("%s", filename)) + { + mkdir(filename, 0755); + } + *pos = '/'; + } + } + + fp = fopen(filename, "w+"); + if (fp) + { + fclose(fp); + } + } +} + +static int find_exe_path(const char *exe, char *pathbuf, int buflen) +{ + int i; + char path[PATH_MAX]; + char *tmpptr = NULL; + char *saveptr = NULL; + char *newenv = NULL; + const char *env = getenv("PATH"); + + if (NULL == env) + { + return 0; + } + + newenv = strdup(env); + if (!newenv) + { + return 0; + } + + tmpptr = newenv; + while (NULL != (tmpptr = strtok_r(tmpptr, ":", &saveptr))) + { + snprintf(path, sizeof(path), "%s/%s", tmpptr, exe); + if (access(path, F_OK) != -1) + { + snprintf(pathbuf, buflen, "%s", path); + free(newenv); + return 1; + } + tmpptr = NULL; + } + + free(newenv); + return 0; +} + +void dump_args(const char *prefix, char **argv) +{ + int i = 0; + + vlog("=========%s ARGS BEGIN===========\n", prefix); + while (argv[i]) + { + vlog("argv[%d]=<%s>\n", i, argv[i]); + i++; + } + vlog("=========%s ARGS END===========\n", prefix); +} + +int pre_check(void) +{ + int ret; + int bit; + int buildbit; + const char *env = NULL; + + env = getenv("DISPLAY"); + if (NULL == env || env[0] != ':') + { + vlog("DISPLAY not exist(%p). Not in X environment.\n", env); + return 1; + } + + ret = get_os_bit(&bit); + if (ret) + { + vlog("Failed to get os bit.\n"); + return 1; + } + + buildbit = strstr(HISO_GUI_ARCH, "64") ? 64 : 32; + vlog("Build bit is %d (%s)\n", buildbit, HISO_GUI_ARCH); + + if (bit != buildbit) + { + vlog("Current system is %d bit (%s). Please run the correct HiperisoGUI.\n", bit, HISO_GUI_ARCH); + return 1; + } + + return 0; +} + +static char * find_argv(int argc, char **argv, char *key) +{ + int i; + int len; + + len = (int)strlen(key); + for (i = 0; i < argc; i++) + { + if (strncmp(argv[i], key, len) == 0) + { + return argv[i]; + } + } + + return NULL; +} + +static int adjust_cur_dir(char *argv0) +{ + int ret = 2; + char c; + char *pos = NULL; + char *end = NULL; + + if (argv0[0] == '.') + { + return 1; + } + + for (pos = argv0; pos && *pos; pos++) + { + if (*pos == '/') + { + end = pos; + } + } + + if (end) + { + c = *end; + *end = 0; + ret = chdir(argv0); + *end = c; + } + + return ret; +} + + + +static char **recover_environ_param(char *env) +{ + int i = 0; + int j = 0; + int k = 0; + int cnt = 0; + char **newenvs = NULL; + + for (i = 0; env[i]; i++) + { + if (env[i] == '\n') + { + cnt++; + } + } + + newenvs = malloc(sizeof(char *) * (cnt + 1)); + if (!newenvs) + { + vlog("malloc new envs fail %d\n", cnt + 1); + return NULL; + } + memset(newenvs, 0, sizeof(char *) * (cnt + 1)); + + for (j = i = 0; env[i]; i++) + { + if (env[i] == '\n') + { + env[i] = 0; + newenvs[k++] = env + j; + j = i + 1; + } + } + + vlog("recover environ %d %d\n", cnt, k); + return newenvs; +} + +static int restart_main(int argc, char **argv, char *guiexe) +{ + int i = 0; + int j = 0; + char *para = NULL; + char **envs = NULL; + char *newargv[MAX_PARAS + 1] = { NULL }; + + para = find_argv(argc, argv, HISO_ENV_STR); + if (!para) + { + vlog("failed to find %s\n", HISO_ENV_STR); + return 1; + } + + newargv[j++] = guiexe; + for (i = 1; i < argc && j < MAX_PARAS; i++) + { + if (strncmp(argv[i], "_hiso_", 6) != 0) + { + newargv[j++] = argv[i]; + } + } + + envs = recover_environ_param(para + strlen(HISO_ENV_STR)); + if (envs) + { + vlog("recover success, argc=%d evecve <%s>\n", j, guiexe); + dump_args("EXECVE", newargv); + execve(guiexe, newargv, envs); + } + else + { + vlog("recover failed, argc=%d evecv <%s>\n", j, guiexe); + execv(guiexe, newargv); + } + + return 1; +} + +static char *create_environ_param(const char *prefix, char **envs) +{ + int i = 0; + int cnt = 0; + int envlen = 0; + int prelen = 0; + char *cur = NULL; + char *para = NULL; + + prelen = strlen(prefix); + for (i = 0; envs[i]; i++) + { + cnt++; + envlen += strlen(envs[i]) + 1; + } + + para = malloc(prelen + envlen); + if (!para) + { + vlog("failed to malloc env str %d\n", prelen + envlen); + return NULL; + } + + cur = para; + memcpy(cur, prefix, prelen); + cur += prelen; + + for (i = 0; envs[i]; i++) + { + envlen = strlen(envs[i]); + memcpy(cur, envs[i], envlen); + + cur[envlen] = '\n'; + cur += envlen + 1; + } + + vlog("create environment param %d\n", cnt); + return para; +} + +static int restart_by_pkexec(int argc, char **argv, const char *curpath, const char *exe) +{ + int i = 0; + int j = 0; + char envcount[64]; + char path[PATH_MAX]; + char pkexec[PATH_MAX]; + char exepara[PATH_MAX]; + char *newargv[MAX_PARAS + 1] = { NULL }; + + vlog("try restart self by pkexec ...\n"); + + if (find_exe_path("pkexec", pkexec, sizeof(pkexec))) + { + vlog("Find pkexec at <%s>\n", pkexec); + } + else + { + vlog("pkexec not found\n"); + return 1; + } + + if (argv[0][0] != '/') + { + snprintf(path, sizeof(path), "%s/%s", curpath, argv[0]); + } + else + { + snprintf(path, sizeof(path), "%s", argv[0]); + } + snprintf(exepara, sizeof(exepara), "%s%s", HISO_GUI_PATH, exe); + + newargv[j++] = pkexec; + newargv[j++] = path; + for (i = 1; i < argc && j < MAX_PARAS; i++) + { + if (strcmp(argv[i], "--xdg") == 0) + { + continue; + } + newargv[j++] = argv[i]; + } + + if (j < MAX_PARAS) + { + newargv[j++] = create_environ_param(HISO_ENV_STR, environ); + } + + if (j < MAX_PARAS) + { + newargv[j++] = exepara; + } + + if (g_xdg_log && j + 1 < MAX_PARAS) + { + newargv[j++] = "-l"; + newargv[j++] = g_log_file; + } + + if (g_xdg_ini && j + 1 < MAX_PARAS) + { + newargv[j++] = "-i"; + newargv[j++] = g_ini_file; + } + + dump_args("PKEXEC", newargv); + execv(pkexec, newargv); + + return 1; +} + +static int ld_cache_lib_check(const char *lib, int *flag) +{ + if (((*flag) & LIB_FLAG_GTK3) == 0) + { + if (strncmp(lib, "libgtk-3.so", 11) == 0) + { + vlog("LIB:<%s>\n", lib); + *flag |= LIB_FLAG_GTK3; + return 0; + } + } + + if (((*flag) & LIB_FLAG_GTK2) == 0) + { + if (strncmp(lib, "libgtk-x11-2.0.so", 17) == 0) + { + vlog("LIB:<%s>\n", lib); + *flag |= LIB_FLAG_GTK2; + return 0; + } + } + + if (((*flag) & LIB_FLAG_GTK4) == 0) + { + if (strncmp(lib, "libgtk-4.so", 11) == 0) + { + vlog("LIB:<%s>\n", lib); + *flag |= LIB_FLAG_GTK4; + return 0; + } + } + + if (((*flag) & LIB_FLAG_QT4) == 0) + { + if (strncmp(lib, "libQt4", 6) == 0) + { + vlog("LIB:<%s>\n", lib); + *flag |= LIB_FLAG_QT4; + return 0; + } + } + + if (((*flag) & LIB_FLAG_QT5) == 0) + { + if (strncmp(lib, "libQt5", 6) == 0) + { + vlog("LIB:<%s>\n", lib); + *flag |= LIB_FLAG_QT5; + return 0; + } + } + + if (((*flag) & LIB_FLAG_QT6) == 0) + { + if (strncmp(lib, "libQt6", 6) == 0) + { + vlog("LIB:<%s>\n", lib); + *flag |= LIB_FLAG_QT6; + return 0; + } + } + + if (((*flag) & LIB_FLAG_GLADE2) == 0) + { + if (strncmp(lib, "libglade-2", 10) == 0) + { + vlog("LIB:<%s>\n", lib); + *flag |= LIB_FLAG_GLADE2; + return 0; + } + } + + return 0; +} + +static int parse_ld_cache(int *flag) +{ + int fd; + int format; + unsigned int i; + struct stat st; + size_t offset = 0; + size_t cache_size = 0; + const char *cache_data = NULL; + struct cache_file *cache = NULL; + struct cache_file_new *cache_new = NULL; + + *flag = 0; + + fd = open(LD_CACHE_FILE, O_RDONLY); + if (fd < 0) + { + vlog("failed to open %s err:%d\n", LD_CACHE_FILE, errno); + return 1; + } + + if (fstat(fd, &st) < 0 || st.st_size == 0) + { + close(fd); + return 1; + } + + cache = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0); + if (cache == MAP_FAILED) + { + close(fd); + return 1; + } + + cache_size = st.st_size; + if (cache_size < sizeof (struct cache_file)) + { + vlog("File is not a cache file.\n"); + munmap (cache, cache_size); + close(fd); + return 1; + } + + if (memcmp(cache->magic, CACHEMAGIC, sizeof CACHEMAGIC - 1)) + { + /* This can only be the new format without the old one. */ + cache_new = (struct cache_file_new *) cache; + + if (memcmp(cache_new->magic, CACHEMAGIC_NEW, sizeof CACHEMAGIC_NEW - 1) || + memcmp (cache_new->version, CACHE_VERSION, sizeof CACHE_VERSION - 1)) + { + munmap (cache, cache_size); + close(fd); + return 1; + } + + format = 1; + /* This is where the strings start. */ + cache_data = (const char *) cache_new; + } + else + { + /* Check for corruption, avoiding overflow. */ + if ((cache_size - sizeof (struct cache_file)) / sizeof (struct file_entry) < cache->nlibs) + { + vlog("File is not a cache file.\n"); + munmap (cache, cache_size); + close(fd); + return 1; + } + + offset = ALIGN_CACHE(sizeof (struct cache_file) + (cache->nlibs * sizeof (struct file_entry))); + + /* This is where the strings start. */ + cache_data = (const char *) &cache->libs[cache->nlibs]; + + /* Check for a new cache embedded in the old format. */ + if (cache_size > (offset + sizeof (struct cache_file_new))) + { + cache_new = (struct cache_file_new *) ((void *)cache + offset); + + if (memcmp(cache_new->magic, CACHEMAGIC_NEW, sizeof CACHEMAGIC_NEW - 1) == 0 && + memcmp(cache_new->version, CACHE_VERSION, sizeof CACHE_VERSION - 1) == 0) + { + cache_data = (const char *) cache_new; + format = 1; + } + } + } + + if (format == 0) + { + vlog("%d libs found in cache format 0\n", cache->nlibs); + for (i = 0; i < cache->nlibs; i++) + { + ld_cache_lib_check(cache_data + cache->libs[i].key, flag); + } + } + else if (format == 1) + { + vlog("%d libs found in cache format 1\n", cache_new->nlibs); + + for (i = 0; i < cache_new->nlibs; i++) + { + ld_cache_lib_check(cache_data + cache_new->libs[i].key, flag); + } + } + + vlog("ldconfig lib flags 0x%x\n", *flag); + vlog("lib flags GLADE2:[%s] GTK2:[%s] GTK3:[%s] GTK4:[%s] QT4:[%s] QT5:[%s] QT6:[%s]\n", + INT2STR_YN((*flag) & LIB_FLAG_GLADE2), INT2STR_YN((*flag) & LIB_FLAG_GTK2), + INT2STR_YN((*flag) & LIB_FLAG_GTK3), INT2STR_YN((*flag) & LIB_FLAG_GTK4), + INT2STR_YN((*flag) & LIB_FLAG_QT4), INT2STR_YN((*flag) & LIB_FLAG_QT5), + INT2STR_YN((*flag) & LIB_FLAG_QT6)); + + munmap (cache, cache_size); + close (fd); + return 0; +} + +static int gui_type_check(HISO_JSON *pstNode) +{ + FILE *fp = NULL; + const char *env = NULL; + const char *arch = NULL; + const char *srctype = NULL; + const char *srcname = NULL; + const char *condition = NULL; + const char *expression = NULL; + char line[1024]; + + arch = hiso_json_get_string_ex(pstNode, "arch"); + srctype = hiso_json_get_string_ex(pstNode, "type"); + srcname = hiso_json_get_string_ex(pstNode, "name"); + condition = hiso_json_get_string_ex(pstNode, "condition"); + expression = hiso_json_get_string_ex(pstNode, "expression"); + + if (srctype == NULL || srcname == NULL || condition == NULL) + { + return 0; + } + + if (arch && NULL == strstr(arch, HISO_GUI_ARCH)) + { + return 0; + } + + vlog("check <%s> <%s> <%s>\n", srctype, srcname, condition); + + if (strcmp(srctype, "file") == 0) + { + if (access(srcname, F_OK) == -1) + { + return 0; + } + + if (strcmp(condition, "exist") == 0) + { + vlog("File %s exist\n", srcname); + return 1; + } + else if (strcmp(condition, "contains") == 0) + { + fp = fopen(srcname, "r"); + if (fp == NULL) + { + return 0; + } + + while (fgets(line, sizeof(line), fp)) + { + if (strstr(line, expression)) + { + vlog("File %s contains %s\n", srcname, expression); + fclose(fp); + return 1; + } + } + + fclose(fp); + return 0; + } + } + else if (strcmp(srctype, "env") == 0) + { + env = getenv(srcname); + if (env == NULL) + { + return 0; + } + + if (strcmp(condition, "exist") == 0) + { + vlog("env %s exist\n", srcname); + return 1; + } + else if (strcmp(condition, "equal") == 0) + { + if (strcmp(expression, env) == 0) + { + vlog("env %s is %s\n", srcname, env); + return 1; + } + return 0; + } + else if (strcmp(condition, "contains") == 0) + { + if (strstr(env, expression)) + { + vlog("env %s is %s contains %s\n", srcname, env, expression); + return 1; + } + return 0; + } + } + + return 0; +} + +static int read_file_to_buf(const char *FileName, int ExtLen, void **Bufer, int *BufLen) +{ + int FileSize; + FILE *fp = NULL; + void *Data = NULL; + + fp = fopen(FileName, "rb"); + if (fp == NULL) + { + vlog("Failed to open file %s", FileName); + return 1; + } + + fseek(fp, 0, SEEK_END); + FileSize = (int)ftell(fp); + + Data = malloc(FileSize + ExtLen); + if (!Data) + { + fclose(fp); + return 1; + } + + fseek(fp, 0, SEEK_SET); + fread(Data, 1, FileSize, fp); + + fclose(fp); + + *Bufer = Data; + *BufLen = FileSize; + + return 0; +} + +static int distro_check_gui_env(char *type, int len, int *pver) +{ + int size; + int length; + char *pBuf = NULL; + HISO_JSON *pstNode = NULL; + HISO_JSON *pstJson = NULL; + + vlog("distro_check_gui_env ...\n"); + + if (access("./tool/distro_gui_type.json", F_OK) == -1) + { + vlog("distro_gui_type.json file not exist\n"); + return 0; + } + + read_file_to_buf("./tool/distro_gui_type.json", 1, (void **)&pBuf, &size); + pBuf[size] = 0; + + pstJson = hiso_json_create(); + hiso_json_parse(pstJson, pBuf); + + for (pstNode = pstJson->pstChild; pstNode; pstNode = pstNode->pstNext) + { + if (gui_type_check(pstNode->pstChild)) + { + length = (int)snprintf(type, len, "%s", hiso_json_get_string_ex(pstNode->pstChild, "gui")); + *pver = type[length - 1] - '0'; + type[length - 1] = 0; + break; + } + } + + hiso_json_destroy(pstJson); + return pstNode ? 1 : 0; +} + +static int detect_gui_exe_path(int argc, char **argv, const char *curpath, char *pathbuf, int buflen) +{ + int i; + int ret; + int ver; + int libflag = 0; + const char *guitype = NULL; + char line[256]; + mode_t mode; + struct stat filestat; + + for (i = 1; i < argc; i++) + { + if (argv[i] && strcmp(argv[i], "--gtk2") == 0) + { + guitype = "gtk"; + ver = 2; + } + else if (argv[i] && strcmp(argv[i], "--gtk3") == 0) + { + guitype = "gtk"; + ver = 3; + } + else if (argv[i] && strcmp(argv[i], "--gtk4") == 0) + { + guitype = "gtk"; + ver = 4; + } + else if (argv[i] && strcmp(argv[i], "--qt4") == 0) + { + guitype = "qt"; + ver = 4; + } + else if (argv[i] && strcmp(argv[i], "--qt5") == 0) + { + guitype = "qt"; + ver = 5; + } + else if (argv[i] && strcmp(argv[i], "--qt6") == 0) + { + guitype = "qt"; + ver = 6; + } + } + + if (guitype) + { + vlog("Get GUI type from param <%s%d>.\n", guitype, ver); + } + else if (access("./hiperiso_gui_type", F_OK) != -1) + { + vlog("Get GUI type from hiperiso_gui_type file.\n"); + + line[0] = 0; + read_file_1st_line("./hiperiso_gui_type", line, sizeof(line)); + if (strncmp(line, "gtk2", 4) == 0) + { + guitype = "gtk"; + ver = 2; + + parse_ld_cache(&libflag); + if ((libflag & LIB_FLAG_GLADE2) == 0) + { + vlog("libglade2 is necessary for GTK2, but not found.\n"); + return 1; + } + } + else if (strncmp(line, "gtk3", 4) == 0) + { + guitype = "gtk"; + ver = 3; + } + else if (strncmp(line, "gtk4", 4) == 0) + { + guitype = "gtk"; + ver = 4; + } + else if (strncmp(line, "qt4", 3) == 0) + { + guitype = "qt"; + ver = 4; + } + else if (strncmp(line, "qt5", 3) == 0) + { + guitype = "qt"; + ver = 5; + } + else if (strncmp(line, "qt6", 3) == 0) + { + guitype = "qt"; + ver = 6; + } + else + { + vlog("Current X environment is NOT supported.\n"); + return 1; + } + } + else + { + vlog("Now detect the GUI type ...\n"); + + parse_ld_cache(&libflag); + + if ((LIB_FLAG_GTK & libflag) > 0 && (LIB_FLAG_QT & libflag) == 0) + { + guitype = "gtk"; + ver = detect_gtk_version(libflag); + } + else if ((LIB_FLAG_GTK & libflag) == 0 && (LIB_FLAG_QT & libflag) > 0) + { + guitype = "qt"; + ver = detect_qt_version(libflag); + } + else if ((LIB_FLAG_GTK & libflag) > 0 && (LIB_FLAG_QT & libflag) > 0) + { + if (distro_check_gui_env(line, sizeof(line), &ver)) + { + guitype = line; + vlog("distro_check_gui <%s%d> ...\n", line, ver); + } + else if (is_gtk_env()) + { + guitype = "gtk"; + ver = detect_gtk_version(libflag); + } + else if (is_qt_env()) + { + guitype = "qt"; + ver = detect_qt_version(libflag); + } + else + { + vlog("Can not distinguish GTK and QT, default use GTK.\n"); + guitype = "gtk"; + ver = detect_gtk_version(libflag); + } + } + else + { + vlog("Current X environment is NOT supported.\n"); + return 1; + } + } + + snprintf(pathbuf, buflen, "%s/tool/%s/Hiperiso2Disk.%s%d", curpath, HISO_GUI_ARCH, guitype, ver); + + vlog("This is %s%d X environment.\n", guitype, ver); + vlog("exe = %s\n", pathbuf); + + if (access(pathbuf, F_OK) == -1) + { + vlog("%s is not exist.\n", pathbuf); + return 1; + } + + if (access(pathbuf, X_OK) == -1) + { + vlog("execute permission check fail, try chmod.\n", pathbuf); + if (stat(pathbuf, &filestat) == 0) + { + mode = filestat.st_mode | S_IXUSR | S_IXGRP | S_IXOTH; + ret = chmod(pathbuf, mode); + vlog("old mode=%o new mode=%o ret=%d\n", filestat.st_mode, mode, ret); + } + } + else + { + vlog("execute permission check success.\n"); + } + + return 0; +} + +int real_main(int argc, char **argv) +{ + int ret; + int euid; + char *exe = NULL; + const char *env = NULL; + char path[PATH_MAX]; + char curpath[PATH_MAX]; + + ret = adjust_cur_dir(argv[0]); + + vlog("\n"); + vlog("=========================================================\n"); + vlog("=========================================================\n"); + vlog("=============== HiperisoGui %s ===============\n", HISO_GUI_ARCH); + vlog("=========================================================\n"); + vlog("=========================================================\n"); + vlog("log file is <%s>\n", g_log_file); + + euid = geteuid(); + getcwd(curpath, sizeof(curpath)); + + vlog("pid:%ld ppid:%ld uid:%d euid:%d\n", (long)getpid(), (long)getppid(), getuid(), euid); + vlog("adjust dir:%d current path:%s\n", ret, curpath); + dump_args("RAW", argv); + + if (access("./boot/boot.img", F_OK) == -1) + { + vlog("Please run under the correct directory!\n"); + return 1; + } + + exe = find_argv(argc, argv, HISO_GUI_PATH); + if (exe) + { + if (euid != 0) + { + vlog("Invalid euid %d when restart.\n", euid); + return 1; + } + + return restart_main(argc, argv, exe + strlen(HISO_GUI_PATH)); + } + else + { + if (pre_check()) + { + return 1; + } + + if (detect_gui_exe_path(argc, argv, curpath, path, sizeof(path))) + { + return 1; + } + + if (strstr(path, "gtk")) + { + env = getenv("XDG_SESSION_TYPE"); + vlog("=== XDG_SESSION_TYPE is <%s> ===\n", env ? env : "NULL"); + + if (env && strncasecmp(env, "wayland", 7) == 0) + { + vlog("Force GDK_BACKEND from %s to x11 for better compatibility\n", env); + setenv("GDK_BACKEND", "x11", 1); + } + } + + if (euid == 0) + { + vlog("We have root privileges, just exec %s\n", path); + argv[0] = path; + execv(argv[0], argv); + } + else + { + vlog("EUID check failed.\n"); + + /* try pkexec */ + restart_by_pkexec(argc, argv, curpath, path); + + vlog("### Please run with root privileges. ###\n"); + return 1; + } + } + + return 1; +} + +int main(int argc, char **argv) +{ + int i; + int ret; + const char *env = NULL; + + snprintf(g_log_file, sizeof(g_log_file), "log.txt"); + for (i = 0; i < argc; i++) + { + if (argv[i] && argv[i + 1] && strcmp(argv[i], "-l") == 0) + { + touch_new_file(argv[i + 1]); + snprintf(g_log_file, sizeof(g_log_file), "%s", argv[i + 1]); + } + else if (argv[i] && argv[i + 1] && strcmp(argv[i], "-i") == 0) + { + touch_new_file(argv[i + 1]); + } + else if (argv[i] && strcmp(argv[i], "--xdg") == 0) + { + env = getenv("XDG_CACHE_HOME"); + if (env) + { + g_xdg_log = 1; + snprintf(g_log_file, sizeof(g_log_file), "%s/hiperiso/hiperiso.log", env); + touch_new_file(g_log_file); + } + else + { + env = getenv("HOME"); + if (env && is_dir_exist("%s/.cache", env)) + { + g_xdg_log = 1; + snprintf(g_log_file, sizeof(g_log_file), "%s/.cache/hiperiso/hiperiso.log", env); + touch_new_file(g_log_file); + } + } + + env = getenv("XDG_CONFIG_HOME"); + if (env) + { + g_xdg_ini = 1; + snprintf(g_ini_file, sizeof(g_ini_file), "%s/hiperiso/Hiperiso2Disk.ini", env); + touch_new_file(g_ini_file); + } + else + { + env = getenv("HOME"); + if (env && is_dir_exist("%s/.config", env)) + { + g_xdg_ini = 1; + snprintf(g_ini_file, sizeof(g_ini_file), "%s/.config/hiperiso/Hiperiso2Disk.ini", env); + touch_new_file(g_ini_file); + } + } + } + } + + g_log_buf = malloc(MAX_LOG_BUF); + if (!g_log_buf) + { + vlog("Failed to malloc log buffer %d\n", MAX_LOG_BUF); + return 1; + } + + ret = real_main(argc, argv); + free(g_log_buf); + return ret; +} + diff --git a/src/gui/main_gtk.c b/src/gui/main_gtk.c new file mode 100644 index 0000000..65ddb50 --- /dev/null +++ b/src/gui/main_gtk.c @@ -0,0 +1,249 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "hiperiso_gtk.h" + +static int g_kiosk_mode = 0; +char g_log_file[PATH_MAX]; +char g_ini_file[PATH_MAX]; + +static int set_image_from_pixbuf(GtkBuilder *pBuilder, const char *id, const void *pData, int len) +{ + GtkImage *pImage = NULL; + GdkPixbuf *pPixbuf = NULL; + GInputStream *pStream = NULL; + + pImage = (GtkImage *)gtk_builder_get_object(pBuilder, id); + pStream = g_memory_input_stream_new_from_data(pData, len, NULL); + pPixbuf = gdk_pixbuf_new_from_stream(pStream, NULL, NULL); + gtk_image_set_from_pixbuf(pImage, pPixbuf); + + return 0; +} + +static int set_window_icon_from_pixbuf(GtkWindow *window, const void *pData, int len) +{ + GdkPixbuf *pPixbuf = NULL; + GInputStream *pStream = NULL; + + pStream = g_memory_input_stream_new_from_data(pData, len, NULL); + pPixbuf = gdk_pixbuf_new_from_stream(pStream, NULL, NULL); + + gtk_window_set_icon(window, pPixbuf); + return 0; +} + +int early_msgbox(GtkMessageType type, GtkButtonsType buttons, const char *str) +{ + int ret; + GtkWidget *pMsgBox = NULL; + + pMsgBox= gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, type, buttons, str); + + ret = gtk_dialog_run(GTK_DIALOG(pMsgBox)); + gtk_widget_destroy(pMsgBox); + + return ret; +} + +static int adjust_cur_dir(char *argv0) +{ + int i; + char *end = NULL; + char dirbuf[PATH_MAX]; + + if (argv0[0] == '.') + { + return 1; + } + + snprintf(dirbuf, sizeof(dirbuf), "%s", argv0); + + for (end = dirbuf; end && *end; end++) + { + if (*end == '/') + { + /* keep walking to last slash */ + } + } + + while (end > dirbuf && *end != '/') + { + end--; + } + + if (*end == '/') + { + *end = 0; + } + + for (i = 0; i < 6; i++) + { + if (access("./boot/boot.img", F_OK) == 0) + { + return 0; + } + + if (chdir(dirbuf) != 0) + { + return 2; + } + + if (access("./boot/boot.img", F_OK) == 0) + { + return 0; + } + + if (chdir("..") != 0) + { + break; + } + + if (getcwd(dirbuf, sizeof(dirbuf) - 1) == NULL) + { + return 2; + } + } + + return 2; +} + +int main(int argc, char *argv[]) +{ + int i; + int len; + const void *pData = NULL; + GtkWidget *pWidget = NULL; + GtkBuilder *pBuilder = NULL; + GError *error = NULL; + struct stat logstat; + + gtk_init(&argc, &argv); + + if (geteuid() != 0) + { + early_msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, + "Hiperiso2Disk permission denied!\r\nPlease run with root privileges."); + return EACCES; + } + + if (access("./boot/boot.img", F_OK) == -1) + { + adjust_cur_dir(argv[0]); + } + + if (access("./boot/boot.img", F_OK) == -1) + { + early_msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "Please run under the correct directory."); + return 1; + } + + for (i = 0; i < argc; i++) + { + if (argv[i] && strcmp(argv[i], "--kiosk") == 0) + { + g_kiosk_mode = 1; + break; + } + } + + snprintf(g_log_file, sizeof(g_log_file), "log.txt"); + snprintf(g_ini_file, sizeof(g_ini_file), "./Hiperiso2Disk.ini"); + for (i = 0; i < argc; i++) + { + if (argv[i] && argv[i + 1] && strcmp(argv[i], "-l") == 0) + { + snprintf(g_log_file, sizeof(g_log_file), "%s", argv[i + 1]); + } + else if (argv[i] && argv[i + 1] && strcmp(argv[i], "-i") == 0) + { + snprintf(g_ini_file, sizeof(g_ini_file), "%s", argv[i + 1]); + } + } + + memset(&logstat, 0, sizeof(logstat)); + if (0 == stat(g_log_file, &logstat)) + { + if (logstat.st_size >= 4 * SIZE_1MB) + { + remove(g_log_file); + } + } + + hiperiso_log_init(); + + vlog("================================================\n"); + vlog("===== Hiperiso2Disk %s powered by GTK%d.x =====\n", hiperiso_get_local_version(), GTK_MAJOR_VERSION); + vlog("================================================\n"); + vlog("log file is <%s> lastsize:%lld\n", g_log_file, (long long)logstat.st_size); + vlog("ini file is <%s>\n", g_ini_file); + + hiperiso_disk_init(); + + hiperiso_http_init(); + + pBuilder = gtk_builder_new(); + if (!pBuilder) + { + vlog("failed to create builder\n"); + return 1; + } + + if (!gtk_builder_add_from_file(pBuilder, "./tool/HiperisoGTK.glade", &error)) + { + vlog("gtk_builder_add_from_file failed:%s\n", error->message); + g_clear_error(&error); + return 1; + } + + if (g_kiosk_mode) + { + gtk_image_set_from_file((GtkImage *)gtk_builder_get_object(pBuilder, "image_refresh"), "/hiperiso/refresh.png"); + gtk_image_set_from_file((GtkImage *)gtk_builder_get_object(pBuilder, "image_secure_local"), "/hiperiso/secure.png"); + gtk_image_set_from_file((GtkImage *)gtk_builder_get_object(pBuilder, "image_secure_dev"), "/hiperiso/secure.png"); + } + else + { + pData = get_refresh_icon_raw_data(&len); + set_image_from_pixbuf(pBuilder, "image_refresh", pData, len); + pData = get_secure_icon_raw_data(&len); + set_image_from_pixbuf(pBuilder, "image_secure_local", pData, len); + set_image_from_pixbuf(pBuilder, "image_secure_dev", pData, len); + } + + pWidget = GTK_WIDGET(gtk_builder_get_object(pBuilder, "window")); + gtk_widget_show_all(pWidget); + + pData = get_window_icon_raw_data(&len); + set_window_icon_from_pixbuf(GTK_WINDOW(pWidget), pData, len); + + on_init_window(pBuilder); + g_signal_connect(G_OBJECT(pWidget), "delete_event", G_CALLBACK(on_exit_window), NULL); + g_signal_connect(G_OBJECT(pWidget), "destroy", G_CALLBACK(gtk_main_quit), NULL); + + gtk_main(); + + hiperiso_disk_exit(); + hiperiso_http_exit(); + + g_object_unref (G_OBJECT(pBuilder)); + + vlog("######## Hiperiso2Disk GTK %s exit ########\n", hiperiso_get_local_version()); + + /* log exit must at the end */ + hiperiso_log_exit(); + return 0; +} + diff --git a/src/gui/main_webui.c b/src/gui/main_webui.c new file mode 100644 index 0000000..fa21cc0 --- /dev/null +++ b/src/gui/main_webui.c @@ -0,0 +1,101 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +char g_log_file[PATH_MAX]; +char g_ini_file[PATH_MAX]; + +int hiperiso_log_init(void); +void hiperiso_log_exit(void); + +void hiperiso_signal_stop(int sig) +{ + vlog("hiperiso server exit due to signal ...\n"); + printf("hiperiso server exit ...\n"); + + hiperiso_http_stop(); + hiperiso_http_exit(); + hiperiso_disk_exit(); + hiperiso_log_exit(); + exit(0); +} + +int main(int argc, char **argv) +{ + int i; + int rc; + const char *ip = "127.0.0.1"; + const char *port = "24680"; + + if (argc != 3) + { + printf("Invalid argc %d\n", argc); + return 1; + } + + if (isdigit(argv[1][0])) + { + ip = argv[1]; + } + + if (isdigit(argv[2][0])) + { + port = argv[2]; + } + + snprintf(g_log_file, sizeof(g_log_file), "log.txt"); + snprintf(g_ini_file, sizeof(g_ini_file), "./Hiperiso2Disk.ini"); + for (i = 0; i < argc; i++) + { + if (argv[i] && argv[i + 1] && strcmp(argv[i], "-l") == 0) + { + snprintf(g_log_file, sizeof(g_log_file), "%s", argv[i + 1]); + } + else if (argv[i] && argv[i + 1] && strcmp(argv[i], "-i") == 0) + { + snprintf(g_ini_file, sizeof(g_ini_file), "%s", argv[i + 1]); + } + } + + hiperiso_log_init(); + + vlog("===============================================\n"); + vlog("===== Hiperiso2Disk %s %s:%s =====\n", hiperiso_get_local_version(), ip, port); + vlog("===============================================\n"); + + hiperiso_disk_init(); + + hiperiso_http_init(); + + rc = hiperiso_http_start(ip, port); + if (rc) + { + printf("Hiperiso failed to start http server, check log.txt for detail\n"); + } + else + { + signal(SIGINT, hiperiso_signal_stop); + signal(SIGTSTP, hiperiso_signal_stop); + signal(SIGQUIT, hiperiso_signal_stop); + while (1) + { + sleep(100); + } + } + + return 0; +} +