800*320工程文件+初始demo提交

This commit is contained in:
2024-03-07 16:46:43 +08:00
parent 33e6eb45b3
commit 70ec3005bb
3306 changed files with 3374364 additions and 2563 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,41 @@
#ifndef __CHSC6X_COMP_H__
#define __CHSC6X_COMP_H__
struct ts_fw_infos {
unsigned short chsc6x_cfg_version; //customer read
unsigned short chsc6x_boot_version; //customer read
unsigned short chsc6x_vendor_id; //customer read
unsigned short chsc6x_project_id; //customer read
unsigned short chsc6x_chip_id; //customer read
unsigned short chsc6x_chip_type; //customer read
unsigned short chsc6x_rpt_lcd_x; //customer read must after chsc6x_get_chip_info
unsigned short chsc6x_rpt_lcd_y; //customer read must after chsc6x_get_chip_info
unsigned short chsc6x_max_pt_num; //customer read must after chsc6x_get_chip_info
};
/* FUNC In your systerm init process,Must call this interface function to detec if the TP IC is Chipsemi corp'.
* PARM pfw_infos: to get top 5 fw info in struct ts_fw_infos.
* PARM update_ret_flag: point value=1 update succeed; point value=0 update failed, If opend CHSC6X_AUTO_UPGRADE macro.
* RETURN 1:is chsc chip, 0:is not chsc chip
*/
extern int chsc6x_tp_dect(struct ts_fw_infos *pfw_infos, unsigned char *update_ret_flag);
/* FUNC You can call this interfacce function to realize upgrade TP Firmware by OTA.
* PARM pfw_infos: to get top 6 fw infos in struct ts_fw_infos, after ota upgrade.
* PARM p_fw_upd: array address of the upgrade firmware array
* PARM fw_len: total size of the upgrade firmware array
* RETURN NULL
*/
extern void chsc6x_ota_upgrade_tp_fw(struct ts_fw_infos *pfw_infos, unsigned char* p_fw_upd, unsigned int fw_len);
/* FUNC: get fw info in struct ts_fw_infos you can call this func anytime.
* PARM pfw_infos: can get all fw infos in struct ts_fw_infos, after call this interface.
* RETURN NULL
*/
extern void chsc6x_get_chip_info(struct ts_fw_infos *infos);
#endif

View File

@ -0,0 +1,895 @@
#ifndef __CHSC6X_FLASH_BOOT_H__
#define __CHSC6X_FLASH_BOOT_H__
const unsigned char chsc_boot[] = {
0x43,0x48,0x53,0x43,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
0xCC,0x00,0x00,0x00,0x8C,0x36,0x00,0x00,0x01,0xC6,0x0E,0x00,0x01,0xC6,0x0E,0x08,
0x01,0x3C,0x02,0x93,0x1B,0x02,0x02,0x00,0x00,0x01,0x0F,0x01,0x13,0x0F,0x43,0x0A,
0x0A,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0D,0x10,0x0C,0x00,0x00,0x00,
0x00,0x0B,0x08,0x03,0x01,0x04,0x05,0x09,0x02,0x06,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x07,0x0A,0x0F,0x0E,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x18,0x45,0x91,0x02,0x38,0x00,0x72,0x01,0x72,0x01,0x50,0x00,0xF0,0x00,
0x90,0x01,0x00,0x02,0x84,0x03,0x20,0x10,0x78,0x78,0x78,0x78,0x64,0x40,0x08,0x84,
0x08,0x1E,0x26,0x23,0x28,0x26,0x5C,0x0B,0x90,0x08,0x46,0x46,0x23,0x23,0x65,0xBD,
0x1B,0x06,0x11,0x20,0x03,0x19,0x84,0xAF,0x9E,0x40,0x91,0x01,0xC8,0x60,0x2C,0x2D,
0x25,0x11,0x32,0x6A,0x80,0x32,0x21,0x46,0xC8,0x28,0xDA,0x6B,0x59,0x05,0x84,0xA2,
0x26,0x06,0x33,0x08,0x22,0x06,0x2B,0x08,0xF7,0x05,0x07,0x08,0x3E,0x06,0x95,0x08,
0x00,0x00,0x34,0x2D,0x34,0x2D,0x00,0x00,0x00,0x00,0xD6,0x02,0x0E,0x00,0x08,0x08,
0x28,0x10,0x32,0x03,0x51,0x32,0x01,0x21,0x19,0x19,0x11,0x12,0x13,0x13,0x11,0x19,
0x1A,0x1A,0x1D,0x1B,0x1A,0x19,0x19,0x82,0x08,0x80,0x36,0x35,0x2D,0x02,0x88,0x36,
0xBD,0x4E,0x4C,0x54,0x40,0x00,0x88,0x00,0x4A,0x80,0xC0,0x46,0x00,0xA0,0x20,0x09,
0x20,0x0A,0x08,0x50,0x04,0xB1,0x91,0x02,0xFB,0xCB,0x13,0x08,0xC0,0x6B,0x14,0x08,
0x85,0x06,0x12,0x08,0xC0,0x6B,0x13,0x08,0x85,0x06,0x1B,0x08,0x1B,0x09,0x10,0x0A,
0x08,0x50,0x04,0xB1,0x91,0x02,0xFB,0xCB,0x10,0x09,0x11,0x0A,0x00,0xA0,0x08,0x50,
0x04,0xB1,0x91,0x02,0xFB,0xCD,0x0C,0x09,0x04,0xA0,0x08,0x40,0x05,0xA0,0x48,0x40,
0x0C,0x09,0x0D,0x0A,0x0D,0x0B,0x08,0x58,0x10,0x50,0x04,0xB1,0x04,0xB2,0x9A,0x02,
0xF9,0xCB,0x01,0x90,0x19,0x9C,0xC0,0x46,0x12,0x00,0x00,0x00,0x13,0x00,0x00,0x00,
0xFC,0x9D,0x80,0x00,0xFC,0x9C,0x80,0x00,0x0C,0x06,0x80,0x00,0x00,0x84,0x80,0x00,
0x00,0x85,0x80,0x00,0x10,0x36,0x00,0x00,0x04,0x8D,0x80,0x00,0x7C,0x8D,0x80,0x00,
0x00,0x84,0x80,0x00,0x00,0xA0,0x80,0x00,0xCE,0xFA,0xAD,0xDE,0xE0,0x93,0x80,0x00,
0x00,0x65,0x0F,0x64,0xD8,0x6B,0x01,0x64,0xF0,0x64,0x4F,0x06,0x56,0x06,0x5D,0x06,
0x64,0x06,0xF0,0x64,0x44,0x06,0x10,0x64,0x00,0x90,0x10,0x99,0x10,0x6C,0xA0,0x06,
0xF0,0x6C,0xB9,0x06,0xB2,0x06,0xAB,0x06,0xA4,0x06,0xF0,0x6C,0x01,0x6C,0xD0,0x6B,
0x0F,0x6C,0x00,0x69,0x00,0x00,0x00,0x00,0x03,0xA2,0x05,0x80,0x01,0xA2,0x03,0x80,
0x02,0xA2,0x01,0x80,0x00,0xA2,0xFF,0x87,0xCB,0x6B,0x18,0x64,0x80,0xA4,0x23,0x03,
0xC3,0x6B,0x09,0x0B,0x18,0x50,0x04,0xB3,0x19,0x50,0x08,0xBB,0x1A,0x40,0x18,0x48,
0x00,0xA8,0xFC,0xC1,0x01,0xAA,0x02,0xC9,0x08,0xB3,0x18,0x58,0x01,0x80,0x04,0xB3,
0x18,0x58,0x18,0x6C,0xC3,0x6B,0x70,0x07,0x64,0x06,0x80,0x00,0x60,0x06,0x80,0x00,
0x68,0x06,0x80,0x00,0xC0,0x46,0xC0,0x46,0x01,0x08,0x08,0x01,0x01,0x08,0x08,0x01,
0x00,0xFA,0xAA,0x00,0x00,0xFA,0xB4,0x00,0x01,0x08,0x08,0x01,0x01,0x08,0x08,0x01,
0x00,0xFA,0xAA,0x00,0x00,0xFA,0xB4,0x00,0x01,0x08,0x08,0x01,0x01,0x08,0x08,0x01,
0x00,0xFA,0xAA,0x00,0x00,0xFA,0xB4,0x00,0x01,0x08,0x08,0x01,0x01,0x08,0x08,0x01,
0x00,0xFA,0xAA,0x00,0x00,0xFA,0xB4,0x00,0x70,0x65,0x00,0x90,0x67,0x99,0x24,0x0B,
0x00,0xA2,0x1A,0x40,0x23,0x0A,0xB9,0xA1,0x11,0x40,0x1A,0x48,0x00,0xAA,0xFC,0xC1,
0x1F,0x0B,0x01,0xA2,0x1A,0x40,0x20,0x0C,0x20,0x0E,0x81,0xA5,0x06,0xA1,0x06,0xA0,
0x00,0x90,0x5A,0x98,0x0B,0xA0,0x01,0xA1,0x00,0x90,0x56,0x98,0x25,0x40,0x20,0xA3,
0xC0,0x06,0x01,0xBB,0x00,0xAB,0xFB,0xC1,0x66,0xA2,0x32,0x40,0x18,0x09,0x4A,0x4E,
0x01,0xAA,0x09,0xC1,0x17,0x09,0x0B,0x40,0x03,0xB1,0x0B,0x40,0x16,0x0B,0x02,0xA1,
0x19,0x40,0x09,0xBB,0x1A,0x40,0x07,0x80,0x4B,0x4E,0x00,0xAB,0x04,0xC0,0x06,0xA0,
0x00,0x90,0x24,0x98,0x04,0xA8,0xD9,0xC0,0x09,0x0B,0x00,0xA2,0x1A,0x40,0x09,0x0A,
0xAB,0xA1,0x11,0x40,0x1A,0x48,0x00,0xAA,0xFC,0xC1,0x05,0x0B,0x01,0xA2,0x1A,0x40,
0x20,0xA3,0xC0,0x06,0x01,0xBB,0x00,0xAB,0xFB,0xC1,0x00,0x90,0x5F,0x99,0x70,0x6D,
0x0D,0x00,0x80,0x00,0x0C,0x00,0x80,0x00,0x67,0x00,0x80,0x00,0x0F,0x04,0x80,0x00,
0x2C,0x8F,0x80,0x00,0x06,0x04,0x80,0x00,0x09,0x02,0x80,0x00,0x00,0xF6,0x80,0xA3,
0xDB,0xF3,0x00,0xFE,0xC0,0xE8,0x05,0x0B,0x05,0x0A,0x18,0x50,0x01,0xA3,0x11,0x48,
0x0B,0x02,0xFC,0xC1,0x03,0x0B,0x18,0x48,0x70,0x07,0xC0,0x46,0xB8,0x00,0x80,0x00,
0xBA,0x00,0x80,0x00,0xB9,0x00,0x80,0x00,0x00,0xF6,0xC0,0xA3,0xDB,0xF3,0x00,0xFE,
0x09,0xF6,0xC0,0xE8,0x09,0xFC,0x04,0x0B,0x40,0xE8,0x04,0x0A,0x18,0x50,0x01,0xA3,
0x11,0x48,0x0B,0x02,0xFC,0xC1,0x70,0x07,0xB8,0x00,0x80,0x00,0xBA,0x00,0x80,0x00,
0x70,0x65,0x0B,0x0A,0x0B,0x0B,0x28,0xB2,0x15,0x48,0x40,0xB3,0x80,0xA2,0x0A,0x09,
0xED,0xE8,0x0A,0x0C,0x12,0xF1,0x07,0x80,0x1E,0x48,0xB6,0xF0,0x36,0x19,0x96,0xEB,
0x46,0x03,0x01,0xB3,0x0E,0x20,0x02,0xB1,0xAB,0x02,0xF5,0xC1,0x70,0x6D,0xC0,0x46,
0x6C,0x90,0x80,0x00,0x00,0x8E,0x80,0x00,0xFC,0x90,0x80,0x00,0x80,0x8D,0x80,0x00,
0x07,0x0A,0x00,0xA3,0x53,0x45,0x93,0x45,0x06,0x0A,0x13,0x40,0x03,0xB2,0x13,0x40,
0x05,0x0B,0x02,0xA2,0x1A,0x40,0x01,0xA2,0x09,0xBB,0x1A,0x40,0x70,0x07,0xC0,0x46,
0x2C,0x8F,0x80,0x00,0x06,0x04,0x80,0x00,0x09,0x02,0x80,0x00,0x00,0x65,0x05,0x0B,
0x1A,0x58,0x08,0xBB,0x1B,0x58,0x13,0x00,0x5A,0xF4,0x01,0xC5,0x00,0x90,0x6C,0x98,
0x00,0x6D,0xC0,0x46,0x48,0x06,0x80,0x00,0xF0,0x65,0x02,0xEC,0x00,0xA4,0x00,0xA3,
0x40,0xA0,0x07,0x0E,0x09,0x80,0x15,0x28,0xA5,0x02,0x04,0xC9,0xF7,0x1C,0x00,0xAF,
0x01,0xC1,0x2C,0xEC,0x18,0xEC,0x01,0xB3,0x02,0xB2,0x8B,0x02,0xF3,0xCB,0xF0,0x6D,
0x80,0x92,0x80,0x00,0x80,0xEA,0xC9,0xEA,0x02,0xEC,0x0B,0xEC,0x50,0x03,0x59,0x03,
0x08,0xE8,0x70,0x07,0x30,0x65,0x05,0xEC,0x1C,0xEC,0xAA,0x02,0x0A,0xC0,0x03,0x38,
0x59,0xEA,0x80,0xEA,0x48,0x03,0x51,0xEB,0xFF,0x97,0xC8,0x9E,0x01,0xE9,0x00,0xA9,
0x00,0xCC,0x01,0xA1,0x09,0xF4,0x08,0xE4,0x30,0x6D,0x10,0x65,0x00,0xA4,0x03,0x1F,
0x01,0xA0,0x93,0x02,0x04,0xCB,0x89,0xEA,0xD8,0xE7,0xCA,0xFF,0x8B,0x02,0x50,0x01,
0x10,0x6D,0x10,0x65,0x04,0x58,0x03,0xEC,0x94,0x02,0x01,0xCA,0x02,0x50,0x04,0x80,
0x89,0xEA,0x00,0xA0,0x8C,0x02,0x01,0xCB,0x19,0x50,0x01,0xA0,0x10,0x6D,0x92,0xF8,
0x00,0xA3,0x01,0x80,0x02,0xD0,0x01,0xB3,0x93,0x02,0xFB,0xC3,0x70,0x07,0x10,0x65,
0x00,0xA3,0x02,0x80,0x10,0xD9,0x10,0xD0,0x01,0xB3,0x93,0x02,0xFA,0xC3,0x10,0x6D,
0x04,0x0B,0x1B,0x58,0x18,0xEA,0x4B,0xF0,0x59,0xE8,0xC9,0xF0,0x81,0x02,0x80,0x01,
0x40,0x02,0x70,0x07,0x34,0x06,0x80,0x00,0x10,0x65,0x12,0x0B,0x03,0xA2,0x1A,0x40,
0x11,0x0C,0x63,0x4E,0x00,0xAB,0x0E,0xC1,0x02,0xA0,0x00,0x90,0x81,0x9B,0xA3,0x4D,
0x0E,0xAB,0x0B,0xC8,0x0D,0x0B,0x01,0xA2,0x1A,0x40,0xA3,0x4D,0x01,0xB3,0x1B,0xF6,
0x1B,0xFE,0xA3,0x45,0x04,0x80,0x04,0xA0,0xFF,0x97,0x3A,0x9F,0x01,0xA3,0x63,0x45,
0x05,0x0B,0x5B,0x4D,0x01,0xAB,0x03,0xC1,0x05,0x0A,0x13,0x40,0x03,0xB2,0x13,0x40,
0x10,0x6D,0xC0,0x46,0x09,0x02,0x80,0x00,0x2C,0x8F,0x80,0x00,0x00,0x02,0x80,0x00,
0x06,0x04,0x80,0x00,0x04,0x0A,0x80,0xA3,0x10,0x58,0x11,0x58,0x5B,0xF4,0x19,0x03,
0x18,0x00,0x11,0x50,0x70,0x07,0xC0,0x46,0x40,0x06,0x80,0x00,0x10,0x65,0x04,0xEC,
0x00,0x90,0x88,0x9B,0x03,0xA1,0x02,0xA0,0xFF,0x97,0xFE,0x9E,0x17,0x0A,0x18,0x0B,
0x00,0xA1,0x1A,0x20,0x14,0xA0,0xFF,0x97,0xF7,0x9E,0x06,0xA1,0x11,0xA0,0xFF,0x97,
0xF3,0x9E,0x01,0xA1,0x05,0xA0,0xFF,0x97,0xEF,0x9E,0x21,0xF6,0x09,0xFE,0x08,0xA0,
0xFF,0x97,0xEA,0x9E,0x21,0xF4,0x09,0xFE,0x24,0xF2,0x09,0xA0,0xFF,0x97,0xE4,0x9E,
0x21,0xFE,0x0A,0xA0,0xFF,0x97,0xE0,0x9E,0x0A,0x0A,0x01,0xA3,0x13,0x40,0x03,0xB2,
0x13,0x40,0x09,0x0B,0x66,0xA2,0x1A,0x40,0x01,0xA1,0x01,0xA0,0xFF,0x97,0xD4,0x9E,
0x6C,0xA1,0x00,0xA0,0xFF,0x97,0xD0,0x9E,0x10,0x6D,0xC0,0x46,0x01,0x01,0x00,0x00,
0x6C,0x00,0x80,0x00,0x06,0x04,0x80,0x00,0x0F,0x04,0x80,0x00,0x10,0x65,0x64,0xA1,
0x00,0xA0,0xFF,0x97,0xC1,0x9E,0x00,0xA1,0x14,0xA0,0xFF,0x97,0xBD,0x9E,0x04,0xA1,
0x06,0xA0,0xFF,0x97,0xB9,0x9E,0x03,0xA1,0x01,0xA0,0xFF,0x97,0xB5,0x9E,0x16,0x0B,
0x00,0xA4,0x1C,0x40,0x03,0xB3,0x1C,0x40,0xFF,0x97,0x9C,0x9F,0x06,0xA0,0xFF,0x97,
0x95,0x9E,0x83,0xF7,0x0B,0xC5,0x11,0x0B,0xDC,0x45,0x11,0x0B,0x1B,0x58,0x7A,0xB3,
0x1B,0x48,0x0F,0xA2,0x1A,0x00,0x0F,0x0B,0x01,0xBA,0x2C,0xB3,0x1A,0x40,0x0B,0x0B,
0x5A,0x4E,0x02,0xAA,0x04,0xC1,0x01,0xA2,0x5A,0x45,0x32,0xA2,0x1A,0x46,0x06,0x80,
0x5A,0x4E,0x00,0xAA,0x01,0xC1,0x01,0xA2,0x00,0x80,0x00,0xA2,0x5A,0x45,0x03,0x0B,
0x00,0xA2,0x9A,0x45,0x10,0x6D,0xC0,0x46,0x06,0x04,0x80,0x00,0x2C,0x8F,0x80,0x00,
0x7C,0x93,0x80,0x00,0x6C,0x90,0x80,0x00,0x00,0x65,0x19,0x0B,0x19,0x28,0x19,0x0B,
0x28,0xB3,0x1B,0x48,0x9A,0xF0,0xD3,0xE8,0xDA,0xE0,0x17,0x0B,0x91,0x02,0x0A,0xCD,
0x1A,0x48,0x01,0xB2,0x12,0xF6,0x12,0xFE,0x1A,0x40,0x08,0xAA,0x05,0xC9,0x13,0x09,
0x00,0xA2,0x0A,0x40,0x00,0x80,0x00,0xA2,0x1A,0x40,0x10,0x0B,0x1A,0x48,0x03,0xAA,
0x15,0xC8,0x0F,0x0A,0x11,0x28,0x01,0xB1,0x09,0xF4,0x09,0xFC,0x11,0x20,0x1A,0x48,
0x01,0xB2,0x12,0xF6,0x12,0xFE,0x1A,0x40,0x00,0xA2,0xDA,0x45,0x5A,0x46,0x05,0x0B,
0x28,0xB3,0x1A,0x48,0x07,0x08,0x52,0xF0,0x07,0x09,0x02,0x90,0xCA,0x9D,0x00,0x6D,
0x7C,0x92,0x80,0x00,0x6C,0x90,0x80,0x00,0x7C,0x8D,0x80,0x00,0x2C,0x8F,0x80,0x00,
0xB8,0x93,0x80,0x00,0x9C,0x90,0x80,0x00,0xFC,0x90,0x80,0x00,0x10,0x65,0x17,0x0B,
0x1A,0xEC,0x80,0xB2,0x14,0x48,0x16,0x0A,0x81,0xB3,0x19,0x48,0x53,0xEC,0xD8,0x4F,
0x93,0xEC,0xDB,0x4F,0x09,0xF2,0x1B,0xF2,0x21,0x03,0x03,0x03,0x99,0x02,0x1C,0xC2,
0x13,0xEC,0x2B,0xB3,0x19,0x48,0x0F,0x0B,0x1B,0x28,0x01,0xB1,0x99,0x02,0x14,0xCB,
0x28,0xB2,0x10,0x48,0x0C,0x0B,0x40,0xF0,0x0C,0x09,0xC0,0xE8,0x0B,0x80,0x1A,0x28,
0x12,0xF4,0x12,0xE4,0x00,0xAA,0x04,0xCA,0x0C,0x28,0x52,0x02,0xD2,0xE0,0xA2,0xEA,
0x0A,0x20,0x02,0xB3,0x02,0xB1,0x83,0x02,0xF1,0xC1,0x10,0x6D,0xA4,0x8F,0x80,0x00,
0x6C,0x90,0x80,0x00,0x7C,0x92,0x80,0x00,0x1C,0x92,0x80,0x00,0x9C,0x90,0x80,0x00,
0xF0,0x65,0x3E,0x0C,0x23,0x48,0x05,0xF4,0x2D,0xFC,0x03,0xAB,0x75,0xC9,0xFF,0x97,
0xBD,0x9F,0x63,0x4B,0x18,0xEE,0x02,0xC0,0x00,0xA2,0x39,0x0B,0x6C,0x80,0x39,0x0A,
0x13,0xEC,0x80,0xB3,0x81,0xB2,0x19,0x48,0x13,0x48,0x1B,0xF2,0x0B,0x03,0x36,0x09,
0x4A,0xEC,0xD6,0x4F,0x8A,0xEC,0xD2,0x4F,0x12,0xF2,0x32,0x03,0x93,0x02,0x02,0xC9,
0x2F,0x0A,0x50,0x40,0x59,0x80,0x28,0xAB,0x22,0xC9,0x62,0x49,0x10,0xEE,0x1F,0xC1,
0x2B,0x0B,0x5A,0x48,0x01,0xB2,0x12,0xF6,0x12,0xFE,0x5A,0x40,0x0F,0xAA,0x4C,0xC9,
0x58,0x40,0x28,0xB1,0x0C,0x48,0x29,0x0B,0x64,0xF0,0x29,0x0A,0xE4,0xE8,0x0C,0x80,
0x19,0x28,0x09,0xF4,0x08,0xE4,0x00,0xA8,0x05,0xCD,0xA8,0x02,0x03,0xCA,0x10,0x28,
0x89,0xE4,0x09,0xE8,0x11,0x20,0x02,0xB3,0x02,0xB2,0xA3,0x02,0xF0,0xC1,0x34,0x80,
0x1A,0x0A,0x51,0x49,0x00,0xA9,0x04,0xC0,0x52,0x49,0x01,0xAA,0x29,0xC1,0x13,0xAB,
0x27,0xC8,0x17,0x0B,0x9A,0x48,0x01,0xB2,0x12,0xF6,0x12,0xFE,0x9A,0x40,0x0F,0xAA,
0x23,0xC9,0x00,0xA2,0x9A,0x40,0x14,0x0B,0x1A,0xEC,0x28,0xB2,0x29,0xB3,0x17,0x48,
0x1E,0x48,0x12,0x09,0x12,0x0A,0x00,0xA3,0x10,0x80,0x08,0x28,0x04,0xF4,0x24,0xE4,
0x00,0xAC,0x08,0xCD,0xB3,0x02,0x01,0xC3,0xAC,0x02,0x04,0xCA,0x14,0x28,0x00,0xF4,
0x80,0xE4,0x00,0xE9,0x10,0x20,0x01,0xB3,0x02,0xB1,0x02,0xB2,0xBB,0x02,0xEC,0xC3,
0x03,0x80,0x03,0x0B,0x00,0xA2,0x9A,0x40,0x5A,0x40,0xF0,0x6D,0x2C,0x8F,0x80,0x00,
0x7C,0x8D,0x80,0x00,0xA4,0x8F,0x80,0x00,0x6C,0x90,0x80,0x00,0x1C,0x92,0x80,0x00,
0x9C,0x90,0x80,0x00,0x02,0x0B,0x00,0xF6,0x00,0xFE,0x18,0x40,0x70,0x07,0xC0,0x46,
0x01,0x00,0x80,0x00,0x02,0x0B,0x00,0xF6,0x00,0xFE,0x18,0x40,0x70,0x07,0xC0,0x46,
0x09,0x00,0x80,0x00,0x02,0x0B,0x00,0xF6,0x00,0xFE,0x18,0x40,0x70,0x07,0xC0,0x46,
0x0A,0x00,0x80,0x00,0x02,0x0B,0x00,0xF6,0x00,0xFE,0x18,0x40,0x70,0x07,0xC0,0x46,
0x0B,0x00,0x80,0x00,0xF0,0x65,0x3C,0x0B,0x1B,0x48,0x09,0xF6,0x81,0x60,0x04,0xEC,
0x09,0xFE,0x05,0xAB,0x52,0xC1,0x39,0x0B,0x1B,0x4E,0x00,0xAB,0x4E,0xC1,0xB4,0xA0,
0x00,0xA9,0x40,0xC0,0x01,0xA9,0x3A,0xC1,0x35,0x0B,0x08,0xA2,0x1A,0x40,0x35,0x09,
0x0B,0x58,0x00,0x33,0x34,0x0B,0x14,0xA2,0x1A,0x40,0xA2,0xF0,0x12,0xE9,0x10,0xF1,
0x82,0xEA,0x32,0x0E,0x92,0xF0,0x40,0xA5,0x9C,0x06,0x0F,0x58,0x00,0x3B,0xFB,0xEA,
0x93,0x02,0x09,0xC2,0x37,0x58,0x3D,0x02,0xF7,0xC0,0x60,0x06,0x07,0x48,0xF8,0xF6,
0xF3,0xC5,0x2B,0x09,0x08,0xA0,0x08,0x40,0x2A,0x09,0xD3,0xEA,0x8B,0x02,0x0B,0xCD,
0xD8,0xF0,0xC0,0xE8,0x28,0x0B,0x22,0x0A,0x40,0xF0,0x00,0xA1,0xC0,0xE8,0x11,0x40,
0xC0,0xE2,0xFF,0x97,0xA9,0x9C,0x2C,0x80,0x96,0xA1,0x49,0xF0,0x8B,0x02,0x25,0xCD,
0x1C,0x0B,0x18,0x58,0x00,0x39,0x41,0xEA,0x91,0x02,0xFA,0xC3,0x1E,0x80,0x02,0xA9,
0x28,0xC1,0xDF,0xA0,0x40,0xF0,0xFF,0x97,0x97,0x9C,0xA1,0xF0,0x0C,0xE9,0x1B,0x0B,
0x21,0xF1,0x1A,0x58,0x0C,0xEB,0x64,0xF1,0x14,0xEB,0x1A,0x80,0x10,0x0B,0x08,0xA2,
0x1A,0x40,0x10,0x0B,0x1A,0x58,0x00,0x32,0xA2,0xF0,0x12,0xE9,0x11,0xF1,0x8A,0xEA,
0x92,0xF0,0x18,0x58,0x00,0x39,0x41,0xEA,0x91,0x02,0xFA,0xC3,0x08,0x0B,0x00,0xA2,
0x1A,0x40,0xA2,0xF0,0x14,0xE9,0x22,0xF1,0x00,0x3B,0x14,0xEB,0x64,0xF1,0xE4,0xE8,
0x04,0x0B,0x1C,0x50,0x01,0x60,0xF0,0x6D,0x03,0x00,0x80,0x00,0x2C,0x8F,0x80,0x00,
0x68,0x00,0x80,0x00,0x34,0x06,0x80,0x00,0x22,0x00,0x80,0x00,0x48,0x06,0x80,0x00,
0x83,0x00,0x80,0x00,0x0E,0x10,0x00,0x00,0x08,0xE7,0xFE,0xFF,0x68,0x90,0x80,0x00,
0x10,0x65,0x24,0x0B,0x66,0xA2,0x1A,0x40,0x02,0xA1,0x02,0xA0,0xFF,0x97,0xC4,0x9C,
0x21,0x0B,0xAA,0xA2,0x21,0x0C,0x1A,0x40,0xFF,0xA3,0x23,0x40,0x00,0x90,0x42,0x99,
0x1F,0x0A,0x00,0xA3,0x13,0x50,0x11,0x58,0x08,0xB2,0x11,0x50,0x28,0xBA,0x23,0x40,
0x13,0x40,0x10,0xB2,0x13,0x50,0x1B,0x0A,0x08,0xA1,0x11,0x40,0x1A,0x09,0x04,0xBA,
0x11,0x20,0x1A,0x09,0x5C,0xA2,0x0A,0x40,0x08,0xB1,0x0A,0x40,0x01,0xB1,0x0A,0x40,
0x01,0xB1,0x0A,0x40,0x16,0x0A,0x05,0xA1,0x11,0x40,0x16,0x09,0x25,0xB2,0x11,0x20,
0x40,0xB2,0x13,0x40,0x14,0x0B,0x7F,0xA2,0x1A,0x40,0xE0,0xA3,0x1B,0xF2,0x1C,0x48,
0x12,0x0B,0x1B,0x48,0x63,0x00,0xFF,0xAB,0x09,0xC1,0x23,0xEC,0x50,0xBB,0x1B,0xF6,
0x1B,0xFE,0xA8,0xAB,0x03,0xC8,0x03,0xA0,0x21,0xEC,0xFF,0x97,0x85,0x9C,0x0C,0x0B,
0x1C,0x21,0x10,0x6D,0x0F,0x04,0x80,0x00,0x10,0x04,0x80,0x00,0x61,0x00,0x80,0x00,
0x40,0x06,0x80,0x00,0x86,0x00,0x80,0x00,0x07,0x08,0x00,0x00,0x01,0x00,0x80,0x00,
0x03,0x00,0x80,0x00,0x00,0x9F,0xFF,0xFF,0x64,0x00,0x80,0x00,0x01,0xE0,0x00,0x00,
0xB8,0x93,0x80,0x00,0x00,0x65,0x22,0x0A,0x22,0x0B,0x10,0xA0,0x1A,0x50,0x03,0xA1,
0xFF,0x97,0x62,0x9C,0x64,0xA1,0x00,0xA0,0xFF,0x97,0x5E,0x9C,0x06,0xA0,0xFF,0x97,
0x45,0x9C,0x01,0xEC,0x06,0xA0,0xFF,0x97,0x57,0x9C,0x1B,0x0B,0xF0,0xA2,0x1A,0x40,
0x1A,0x09,0x00,0xA2,0x06,0xB3,0x1A,0x40,0x03,0xB3,0x1A,0x40,0x0A,0x20,0x18,0x0A,
0x00,0xA3,0x13,0x40,0x17,0x0A,0x13,0xA1,0x11,0x40,0x17,0x08,0x01,0xBA,0x13,0x40,
0x02,0xA2,0x02,0x40,0x01,0xB0,0x01,0x40,0x14,0x09,0x0B,0x40,0x07,0xB1,0x0A,0x40,
0x13,0x0A,0x13,0x40,0x13,0x0A,0x13,0x40,0x01,0xA3,0x01,0xB2,0x13,0x40,0x12,0x0A,
0x13,0x40,0x12,0x0A,0x12,0x0B,0x12,0xF4,0x12,0xFC,0x1A,0x20,0x11,0x08,0xF0,0xA2,
0x00,0xA1,0xFF,0x97,0xCC,0x9C,0x10,0x0B,0x82,0xA2,0x1A,0x40,0x00,0x6D,0xC0,0x46,
0x00,0x9E,0x80,0x00,0x7C,0x93,0x80,0x00,0x00,0x04,0x80,0x00,0x0A,0x04,0x80,0x00,
0x0E,0x04,0x80,0x00,0x0C,0x02,0x80,0x00,0x0D,0x02,0x80,0x00,0x01,0x02,0x80,0x00,
0x12,0x02,0x80,0x00,0x15,0x04,0x80,0x00,0x17,0x02,0x80,0x00,0x80,0x8D,0x80,0x00,
0x14,0x02,0x80,0x00,0x00,0xE0,0x80,0x00,0x6B,0x00,0x80,0x00,0x18,0x0B,0x1B,0x58,
0x9A,0x49,0x07,0xA1,0x11,0x00,0x17,0x0A,0x20,0xB1,0x11,0x40,0x19,0x29,0x16,0x0A,
0x89,0xF5,0x89,0xFF,0x11,0x40,0x19,0x4A,0x0A,0xB2,0x11,0x20,0x99,0x28,0x0E,0xBA,
0x11,0x20,0x59,0x29,0x02,0xB2,0x11,0x20,0x19,0x4B,0x0F,0xB2,0x11,0x40,0x9A,0x29,
0x18,0xEC,0x0E,0x0B,0x12,0xFA,0x1A,0x40,0xF6,0xB3,0xFF,0xB3,0xFF,0xA2,0x0C,0x09,
0x1A,0x40,0x16,0xB0,0x00,0xA3,0xC2,0x1C,0x00,0xAA,0x02,0xC0,0x8A,0xE8,0x3F,0xB2,
0x13,0x40,0x01,0xB3,0x30,0xAB,0xF6,0xC1,0x06,0x0B,0x02,0xA2,0x1A,0x40,0x70,0x07,
0x7C,0x93,0x80,0x00,0x0D,0x04,0x80,0x00,0x06,0x02,0x80,0x00,0x17,0x02,0x80,0x00,
0x00,0x8E,0x80,0x00,0x09,0x02,0x80,0x00,0x00,0x65,0x06,0x0A,0x06,0x0B,0x1A,0x50,
0xFF,0x97,0xB0,0x9C,0x05,0x0A,0x80,0xA3,0x11,0x58,0xDB,0xF1,0x0B,0x03,0x13,0x50,
0x00,0x6D,0xC0,0x46,0x09,0xF0,0x00,0x00,0x20,0x06,0x80,0x00,0x40,0x06,0x80,0x00,
0xF0,0x65,0x17,0x0B,0x9C,0x4D,0x17,0x0A,0x17,0x0B,0x18,0x09,0x00,0xAC,0x07,0xC0,
0x28,0xB1,0x0D,0x48,0x40,0xB3,0x80,0xA1,0xED,0xE8,0x15,0x0C,0x09,0xF1,0x1C,0x80,
0x28,0xB1,0x0D,0x48,0x40,0xB3,0x80,0xA1,0xED,0xE8,0x11,0x0C,0x09,0xF1,0x07,0x80,
0x1E,0x48,0xB6,0xF0,0x36,0x19,0x8E,0xEB,0xC6,0x00,0x16,0x20,0x01,0xB3,0x02,0xB2,
0xAB,0x02,0xF5,0xC1,0x0B,0x80,0x1E,0x48,0xB6,0xF0,0x36,0x19,0x17,0x28,0x8E,0xEB,
0xC6,0x00,0xF6,0xE9,0x16,0x20,0x01,0xB3,0x02,0xB2,0xAB,0x02,0xF3,0xC1,0xF0,0x6D,
0x2C,0x8F,0x80,0x00,0xFC,0x90,0x80,0x00,0x00,0x8E,0x80,0x00,0x6C,0x90,0x80,0x00,
0x80,0x8D,0x80,0x00,0x04,0x0A,0x05,0x0B,0x10,0x58,0x11,0x58,0x0B,0x00,0x13,0x50,
0x80,0xA3,0x5B,0xF4,0x18,0x00,0x70,0x07,0x40,0x06,0x80,0x00,0xFF,0xFF,0xFF,0xFE,
0x70,0x65,0x2B,0x0B,0x00,0xA6,0x1E,0x40,0x2A,0x0D,0x2B,0x58,0x9B,0x49,0x35,0xAB,
0x4D,0xC1,0xFA,0xA0,0x80,0xF0,0x02,0x90,0xA5,0x9A,0x27,0x0C,0x29,0x58,0x20,0xEC,
0x0C,0xA2,0x02,0x90,0xE2,0x9A,0x20,0xEC,0x08,0xA1,0x02,0x90,0xF9,0x9A,0x23,0x48,
0x00,0xA8,0x35,0xC1,0x62,0x48,0xD2,0xE8,0xFF,0xAA,0x31,0xC1,0x42,0xAB,0x0B,0xC1,
0x1E,0x0B,0x1A,0x58,0x05,0xA1,0x51,0x40,0x22,0x49,0xC1,0xAA,0x28,0xC1,0x1C,0x0A,
0x01,0xA1,0x11,0x40,0x1B,0x58,0x11,0x80,0x98,0xAB,0x21,0xC1,0x17,0x0B,0x1A,0x58,
0x05,0xA3,0x53,0x40,0xE1,0x48,0xA3,0x48,0x09,0xF2,0x19,0x03,0x15,0x0B,0x99,0x02,
0x16,0xC1,0x23,0x49,0x55,0xAB,0x03,0xC1,0x56,0x40,0x13,0x0B,0x5E,0x40,0x0F,0x80,
0xAA,0xAB,0x0D,0xC1,0x11,0x08,0xCC,0xA1,0x02,0x90,0xB8,0x9A,0x00,0xA8,0x03,0xC1,
0x00,0x90,0x44,0x9D,0xFF,0x97,0x1A,0x9F,0x08,0x0B,0x1B,0x58,0x00,0xA2,0x5A,0x40,
0x03,0x0B,0x08,0xA2,0x1A,0x40,0x03,0x0B,0x1B,0x58,0x30,0xA2,0x9A,0x41,0x70,0x6D,
0x83,0x00,0x80,0x00,0x24,0x8F,0x80,0x00,0x0C,0x8F,0x80,0x00,0x28,0x8F,0x80,0x00,
0x03,0x00,0x80,0x00,0x36,0x35,0x00,0x00,0x2C,0x8F,0x80,0x00,0x00,0x9E,0x80,0x00,
0x30,0x65,0x04,0x3C,0x80,0xF0,0x24,0xE8,0x20,0x58,0x03,0x3D,0x00,0xA8,0x05,0xC0,
0x00,0xA9,0x03,0xC0,0x00,0xA3,0x23,0x50,0x01,0xA0,0x10,0x80,0x0B,0xAD,0x08,0xC8,
0x19,0xF1,0xCB,0xEA,0x93,0x02,0x09,0xC2,0x28,0xAA,0x07,0xC9,0x01,0xA3,0x23,0x50,
0x04,0x80,0x00,0xA0,0x64,0xAD,0x02,0xC9,0x20,0x50,0x00,0x80,0x00,0xA0,0x30,0x6D,
0xF0,0x65,0x92,0x60,0x11,0x33,0x7D,0x0B,0x1B,0x58,0x7C,0xB3,0x1B,0x28,0x0C,0x33,
0x03,0x28,0x14,0xEC,0x1A,0xF4,0x05,0xEC,0x0E,0xEC,0x79,0x0F,0x00,0xAA,0x00,0xCC,
0x89,0x83,0x39,0x1D,0x77,0x0A,0x00,0xA9,0x00,0xC1,0xF9,0x82,0x76,0x08,0x67,0xF1,
0x38,0xE8,0x03,0x30,0x12,0x1D,0x0A,0x32,0x00,0xA2,0x08,0xA9,0x00,0xC1,0x0A,0x3A,
0xE7,0xF0,0xBA,0xE8,0x71,0x08,0x52,0xF0,0x10,0x1A,0x0F,0x30,0x70,0x08,0x10,0x1A,
0x0A,0x3A,0x10,0x30,0x07,0xB2,0x07,0xA0,0x10,0x00,0x1B,0xF4,0x84,0x06,0x1B,0xE4,
0x07,0x33,0x67,0x04,0x69,0x0A,0x7F,0xF0,0xBA,0x1A,0x9B,0xEA,0x0D,0x32,0x00,0xA2,
0xB0,0x1E,0x05,0x33,0x09,0x30,0x66,0x0B,0xFF,0x1A,0x0E,0x37,0xC7,0xEB,0x05,0x38,
0xC2,0xE7,0x83,0xE8,0x53,0x00,0x1B,0xF4,0xF8,0xE7,0x1B,0xFC,0x04,0x33,0x3B,0xE8,
0x43,0x00,0x60,0x0A,0x1B,0xF4,0x1B,0xFC,0x0B,0x37,0x03,0x38,0x06,0x33,0x03,0x32,
0x00,0xA7,0x00,0xA2,0x8C,0x06,0x08,0x34,0x16,0x80,0x10,0xD8,0x01,0xA1,0x3B,0xEC,
0x21,0x02,0x0F,0xC0,0xE3,0xF3,0x57,0x09,0x03,0x3C,0x1B,0xFC,0x8C,0x02,0x02,0xC0,
0x9C,0x02,0x03,0xC3,0x03,0x80,0x1F,0xEC,0x03,0x33,0x00,0x80,0x03,0x33,0x9F,0x02,
0x00,0xC8,0x3B,0xEC,0x01,0xB2,0x1F,0xEC,0x62,0x05,0xE6,0xC3,0x03,0x3A,0xD0,0xEB,
0x00,0xF4,0x08,0x3C,0x00,0xFC,0x64,0xAF,0x07,0xC9,0x4A,0x0B,0x11,0xEC,0x79,0x03,
0x58,0x03,0xFF,0x97,0xB3,0x99,0x00,0xF4,0x00,0xFC,0x04,0x39,0x00,0xA3,0x08,0x33,
0x02,0xA9,0x1E,0xC9,0x2B,0xA3,0x63,0x03,0x43,0x0A,0xD3,0xE8,0x02,0xB3,0xDB,0x4F,
0x05,0xAB,0x16,0xC0,0x0D,0x3A,0x0F,0x39,0x53,0xEA,0x05,0x3A,0x53,0x03,0x06,0x39,
0xDB,0xFF,0x08,0x33,0x0B,0xEC,0x04,0x39,0x5B,0xE8,0x1E,0xAB,0x09,0xCD,0x13,0xA8,
0x07,0xC8,0x8F,0xA2,0x00,0xA3,0xBA,0x02,0x5B,0x01,0x08,0x3A,0x5B,0x02,0x1A,0x00,
0x08,0x32,0x06,0x3F,0x00,0xA3,0x05,0x33,0x02,0xAF,0x1D,0xC9,0x2B,0xA3,0x63,0x03,
0x31,0x0A,0xD3,0xE8,0x02,0xB3,0xDB,0x4F,0x05,0xAB,0x15,0xC0,0x0E,0x39,0x10,0x3A,
0x0B,0x3F,0x8B,0xEA,0x7B,0x03,0xDB,0xFF,0x05,0x33,0x13,0xA8,0x0C,0xC8,0x06,0x38,
0x03,0xEC,0x04,0x38,0x1B,0xE8,0x1E,0xAB,0x06,0xCD,0x03,0x39,0x05,0x3A,0x45,0xA3,
0x8B,0x02,0x9B,0x01,0x1A,0x00,0x05,0x32,0x0C,0x3B,0x1B,0xFA,0x0B,0x33,0x07,0x3A,
0x09,0x3B,0x0D,0x38,0x0E,0x39,0xFF,0x97,0x85,0x9A,0x0B,0x3F,0x1F,0x0A,0xA3,0xF0,
0xB8,0x02,0x05,0xC2,0xD1,0x18,0x1D,0xA9,0x4F,0xC8,0x01,0xB1,0xD1,0x10,0x4C,0x80,
0x00,0xA1,0xD1,0x10,0x0B,0x39,0x4A,0xF0,0x90,0x02,0x46,0xC2,0x18,0x0A,0xD2,0x18,
0x04,0xAA,0x42,0xCC,0x17,0x09,0x2A,0x28,0xCB,0x18,0x11,0xF4,0x09,0xE4,0xC9,0xEA,
0x01,0xA9,0x01,0xCD,0x9A,0xEC,0x02,0x80,0x01,0xB1,0x02,0xCA,0x9A,0xEE,0x12,0xF4,
0x12,0xFC,0x2A,0x20,0x10,0x0A,0x33,0x28,0xA1,0xF0,0x8A,0x18,0x19,0xF4,0x09,0xE4,
0x89,0xEA,0x01,0xA9,0x1A,0xCD,0x93,0xEC,0x1B,0x80,0xC0,0x46,0x7C,0x93,0x80,0x00,
0xCC,0x8E,0x80,0x00,0xF8,0x8E,0x80,0x00,0xAC,0x8E,0x80,0x00,0x98,0x8E,0x80,0x00,
0xD8,0x8E,0x80,0x00,0x10,0x27,0x00,0x00,0x4C,0x8F,0x80,0x00,0x00,0x8F,0x80,0x00,
0xF4,0x8E,0x80,0x00,0xA8,0x8E,0x80,0x00,0xF0,0x8E,0x80,0x00,0x01,0xB1,0x02,0xCA,
0x93,0xEE,0x1B,0xF4,0x1B,0xFC,0x33,0x20,0xCC,0x09,0x00,0xA7,0xE8,0x1F,0xA2,0xF0,
0x50,0x10,0x1B,0xF4,0xCA,0x09,0x1B,0xE4,0x53,0x10,0xCA,0x0B,0xA7,0xF0,0xFB,0x18,
0x03,0x33,0x1A,0xF4,0xC8,0x0B,0xFB,0x18,0x04,0x33,0x19,0xF4,0xC7,0x0B,0xDB,0x1B,
0x06,0x33,0xC7,0x0B,0xDB,0x1B,0x07,0x33,0x2B,0xA3,0x18,0xEC,0x60,0x03,0xC5,0x0B,
0x18,0xE8,0x09,0x30,0x03,0xEC,0x02,0xB3,0xDB,0x4F,0x12,0xFC,0x09,0xFC,0x05,0xAB,
0x00,0xC0,0x8E,0x80,0xC0,0x08,0x03,0x1D,0x02,0xAB,0x00,0xC8,0x4D,0x81,0x08,0x3B,
0x05,0x38,0x03,0x02,0x00,0xC0,0x48,0x81,0x12,0xF4,0x09,0xF4,0x12,0xE4,0x09,0xE4,
0x03,0x32,0x04,0x31,0x07,0x3A,0x06,0x39,0x08,0xF4,0x11,0xF4,0x00,0xE4,0x09,0xE4,
0x03,0x3A,0x04,0x3B,0xFF,0x97,0xF6,0x99,0x64,0xA8,0x20,0xC9,0xB3,0x0B,0xFB,0x18,
0x03,0xAB,0x1C,0xC8,0xB0,0x0B,0x1A,0x1D,0x03,0xAA,0x18,0xC9,0x09,0x3B,0x03,0xB3,
0xDB,0x4F,0x02,0xAB,0x13,0xC1,0xAE,0x0B,0x1B,0x1D,0x00,0xAB,0x0F,0xC0,0x00,0xA3,
0x04,0xAA,0x03,0xC0,0x0A,0x3B,0x07,0xA2,0x04,0xB3,0x13,0x00,0xE2,0xF0,0xD3,0xE8,
0xA8,0x0A,0x5B,0xF0,0x9A,0x1A,0x06,0x32,0xA7,0x0A,0x9A,0x1A,0x07,0x32,0x06,0x38,
0x03,0x3A,0x07,0xF4,0x03,0x39,0x3F,0xE4,0x79,0xEA,0x07,0x38,0xD7,0xEB,0xFB,0xF0,
0xDF,0xE9,0x04,0x3A,0x09,0x31,0x03,0xF4,0x04,0x39,0x1B,0xE4,0x59,0xEA,0xD3,0xEA,
0xDA,0xF0,0xD3,0xE8,0x5B,0xF0,0x06,0x33,0x12,0xA3,0x0C,0x31,0x07,0x33,0x7F,0xF0,
0xFB,0xE7,0x1B,0xFF,0x06,0x39,0xDB,0xE9,0x03,0x38,0x1B,0xE1,0xC0,0xE8,0xCB,0xE7,
0x1B,0xFF,0x5B,0xE8,0x04,0x3A,0x1B,0xE1,0xD2,0xE8,0x08,0x30,0xB8,0xA3,0x05,0x32,
0x00,0x33,0x01,0x33,0xB9,0xA0,0xB9,0xA1,0x08,0x3A,0x05,0x3B,0x02,0x90,0x86,0x98,
0x00,0xA8,0x0B,0xC0,0x06,0x3A,0x07,0x38,0x13,0xEC,0x0C,0x3A,0x09,0x39,0x01,0xB8,
0x9B,0xE8,0x07,0x30,0x7F,0xE8,0x06,0x33,0x00,0xA8,0xD9,0xC1,0x08,0x3F,0x00,0xAF,
0x01,0xCC,0x01,0xA0,0x08,0x30,0x05,0x39,0x00,0xA9,0x01,0xCC,0x01,0xA2,0x05,0x32,
0x20,0xA7,0x6B,0x06,0xFB,0x1A,0x14,0xA0,0x6F,0x06,0xC7,0x1B,0x2B,0x20,0x37,0x20,
0xC3,0x80,0x07,0xAB,0x00,0xC0,0xC0,0x80,0x12,0xF4,0x12,0xE4,0x94,0x06,0x07,0x3A,
0x09,0xF4,0x10,0xF4,0x09,0xE4,0x00,0xE4,0x40,0xEA,0x06,0x3F,0xC3,0xE7,0xC0,0xE8,
0x3A,0xF4,0x58,0x00,0x12,0xE4,0x63,0x06,0xD2,0xEA,0xD7,0xE7,0xD2,0xE9,0x7A,0x00,
0x82,0xE8,0x00,0xA0,0x33,0x1E,0x59,0xEA,0x00,0xA0,0x2F,0x1E,0x05,0x33,0xCB,0xE7,
0xC8,0xE8,0x61,0x06,0x58,0x00,0x7B,0xEA,0xD9,0xE7,0x5B,0xE8,0x4B,0x00,0xC1,0xE8,
0x65,0x0B,0x1B,0x1D,0x9C,0x06,0x01,0xA3,0x23,0xA9,0x00,0xCC,0x00,0xA3,0x1B,0xF6,
0x00,0xAB,0x03,0xC0,0x01,0xA0,0x23,0xA3,0x84,0x05,0x1E,0xC0,0x01,0xA3,0x05,0xAA,
0x00,0xCC,0x00,0xA3,0x1B,0xF6,0x00,0xAB,0x12,0xC0,0x07,0xA3,0x9C,0x05,0x0F,0xC8,
0x53,0xF0,0x99,0x02,0x0C,0xCD,0x48,0xE0,0x84,0x06,0x94,0x05,0x03,0xCC,0xD0,0xEC,
0x84,0x06,0x8C,0x05,0x08,0xCB,0x96,0xAB,0x07,0xCD,0x1B,0xE1,0x96,0xB3,0x04,0x80,
0x96,0xA3,0x96,0xA9,0x01,0xCC,0x70,0x80,0x03,0xEC,0x03,0x38,0x03,0x39,0xC9,0xEB,
0x3F,0xEA,0x08,0x37,0x0C,0x31,0x08,0x39,0x3F,0xF1,0x7F,0xEA,0x04,0x38,0x05,0x39,
0x40,0xEA,0x0F,0x30,0x04,0x38,0x08,0xEA,0x05,0x30,0x05,0x39,0x00,0xF1,0x02,0x32,
0x40,0xEA,0x9C,0x06,0x0F,0xA1,0xFB,0xE7,0x1B,0xFF,0xDB,0xE9,0x1B,0xE1,0x09,0x33,
0xC3,0xE7,0x1B,0xFF,0x1B,0xE8,0x1B,0xE1,0x06,0x33,0x04,0x3B,0x1A,0xEC,0x06,0x3B,
0xD2,0xE8,0x06,0x3B,0x07,0x32,0xDA,0xE7,0x9B,0xE8,0x53,0x00,0x10,0x33,0x09,0x3B,
0x1A,0xEC,0x03,0x3B,0xD2,0xE8,0x09,0x3B,0x06,0x32,0xDA,0xE7,0x9B,0xE8,0x53,0x00,
0x09,0x33,0x10,0x3B,0x1A,0xEC,0x09,0x3B,0xD2,0xE8,0x09,0x32,0x0F,0x3A,0x0C,0x3B,
0x80,0xE8,0x09,0x3A,0xFF,0xE8,0x01,0xB9,0x01,0xA3,0x62,0x05,0x00,0xCC,0x00,0xA3,
0x1B,0xF6,0x00,0xAB,0x01,0xC0,0x00,0xA9,0xCD,0xCC,0x02,0x3A,0x09,0x3B,0x93,0x02,
0x14,0xCC,0x08,0x3F,0x02,0xB1,0x3B,0xEC,0x4B,0x03,0xDA,0xE7,0x12,0xFF,0xD3,0xE8,
0x05,0x3A,0x51,0x03,0x03,0x38,0x1B,0xE1,0x1B,0xE8,0x2B,0x20,0xCB,0xE7,0x1B,0xFF,
0x59,0xE8,0x04,0x3B,0x09,0xE1,0xC9,0xE8,0x31,0x20,0x07,0x80,0x18,0xA0,0x6F,0x06,
0xC7,0x1B,0x1C,0xA1,0x68,0x06,0x08,0x1A,0x2F,0x20,0x30,0x20,0x13,0x0A,0x06,0x39,
0xA3,0xF0,0x99,0x10,0x07,0x3F,0x12,0x0A,0x9F,0x10,0x12,0x0A,0xA3,0xF0,0x99,0x18,
0x12,0x0A,0x99,0x10,0x10,0x0A,0x99,0x18,0x11,0x0A,0x99,0x10,0x00,0xA0,0x2A,0x1E,
0x00,0xA1,0x73,0x1E,0x0D,0x38,0x0E,0x39,0xFF,0x97,0xAC,0x98,0x0B,0x3A,0x90,0x02,
0x00,0xC2,0x77,0x80,0x0C,0x0B,0x1F,0x1D,0x00,0xAF,0x4B,0xC0,0x0C,0x0B,0x1B,0x1D,
0x00,0xAB,0x1B,0xC0,0x00,0xA3,0x03,0xAF,0x1C,0xC9,0x43,0x80,0x04,0x8F,0x80,0x00,
0x08,0x8F,0x80,0x00,0xA8,0x8E,0x80,0x00,0xF0,0x8E,0x80,0x00,0xD4,0x8E,0x80,0x00,
0xEC,0x8E,0x80,0x00,0x4C,0x8F,0x80,0x00,0xCC,0x8E,0x80,0x00,0x00,0x8F,0x80,0x00,
0x78,0x93,0x80,0x00,0x98,0x8E,0x80,0x00,0xD8,0x8E,0x80,0x00,0x00,0xA3,0x08,0xAF,
0x00,0xC1,0x0A,0x3B,0xE1,0xF0,0xCB,0xE8,0x73,0x09,0x5B,0xF0,0x00,0xA0,0x2A,0x1E,
0x59,0x1E,0x51,0xEA,0xCA,0xE7,0x89,0xE8,0x70,0x08,0x51,0x00,0x1B,0x1A,0x32,0x28,
0x00,0xA9,0x0E,0xC0,0x18,0xF4,0x12,0xF4,0x12,0xE4,0x00,0xE4,0x10,0xEA,0xC3,0xE7,
0xC0,0xE8,0x58,0x00,0x64,0xA3,0x58,0x03,0xFE,0x97,0x40,0x9F,0x00,0xF4,0x00,0xFC,
0x00,0x80,0x67,0x08,0x0A,0x39,0xE2,0xF0,0x52,0xE8,0x40,0xF0,0x65,0x0B,0x92,0xF0,
0x01,0xB0,0xD0,0x10,0x0A,0x3A,0xE3,0xF0,0x29,0x28,0x9B,0xE8,0x5E,0x0A,0x5B,0xF0,
0x99,0x12,0x5E,0x0A,0x31,0x28,0x99,0x12,0x0A,0x3B,0x07,0xA2,0x01,0xB3,0x1A,0x00,
0x5D,0x0B,0x1A,0x15,0x07,0xAF,0x15,0xC8,0x5C,0x0B,0x01,0xB7,0x1F,0x15,0x11,0x80,
0x55,0x08,0x21,0xF1,0x0B,0x12,0x55,0x0B,0x30,0x28,0xC8,0x12,0x01,0xA3,0x13,0x15,
0x3B,0x15,0x57,0x0A,0x00,0xA7,0xE9,0x1F,0xA3,0xF0,0x99,0x10,0x00,0xA0,0x31,0x1E,
0x54,0x0A,0x99,0x10,0xE3,0xF0,0x54,0x0A,0x1B,0xE9,0x5B,0xF0,0x99,0x1C,0xD3,0xE8,
0x5A,0x48,0x12,0xF2,0x0A,0x03,0x03,0x32,0xD9,0x48,0x9A,0x48,0x09,0xF2,0x11,0x03,
0x0A,0x31,0x5A,0x49,0x19,0x49,0x12,0xF2,0x0A,0x03,0x63,0xF0,0x04,0x32,0x1B,0xE9,
0x4A,0x0A,0x5B,0xF0,0xD3,0xE8,0x5B,0x49,0x00,0xAB,0x50,0xC0,0x48,0x09,0xA7,0xF0,
0x79,0x18,0x48,0x0A,0x8C,0x06,0xB9,0x18,0x00,0xA3,0xEA,0x1E,0x00,0xA0,0x33,0x1E,
0x60,0x06,0xFF,0x97,0x07,0x98,0x11,0x39,0x8A,0xF0,0x52,0xE8,0x91,0xF0,0x42,0x0B,
0x52,0xE8,0x42,0x09,0xF8,0x10,0x8A,0xE8,0x10,0x4A,0x04,0x39,0x84,0x06,0x50,0x4A,
0x0A,0xF4,0x52,0xE4,0x00,0xF2,0x61,0x06,0x12,0xF4,0x01,0x03,0x12,0xFC,0x91,0x02,
0x2D,0xC2,0x0A,0x38,0x02,0xF4,0x12,0xE4,0x04,0x32,0x04,0x38,0x00,0xA2,0xB1,0x1E,
0x41,0xEA,0x18,0xB1,0x30,0xA9,0x22,0xC8,0x03,0x3A,0x11,0xF4,0x00,0xA2,0xA8,0x1E,
0x09,0xE4,0x08,0xEA,0x1D,0xB0,0x3A,0xA8,0x19,0xC8,0x2D,0x08,0x38,0x18,0x84,0x06,
0x8C,0x05,0x14,0xC1,0x2B,0x0A,0x04,0x38,0xB9,0x18,0x81,0x02,0x0F,0xC1,0x28,0xA2,
0x69,0x06,0x51,0x1A,0x0C,0xA0,0x6A,0x06,0x82,0x1A,0x31,0x20,0x2A,0x20,0x1F,0x0A,
0x12,0x1D,0x01,0xAA,0x01,0xC8,0x00,0xA2,0x00,0x80,0x01,0xA2,0xFA,0x10,0x24,0x0B,
0x1B,0x58,0x76,0xB3,0x1B,0x28,0x0F,0xA2,0x13,0x00,0x28,0xEC,0x31,0xEC,0xB9,0xA2,
0x00,0x90,0x26,0x99,0x15,0x80,0x13,0x0B,0x60,0xF1,0xC0,0xE8,0x00,0xA1,0x08,0xA2,
0xFE,0x97,0xE5,0x9F,0x10,0x0A,0x00,0xA3,0x13,0x15,0x1A,0x0A,0x03,0xA1,0x11,0x15,
0x19,0x09,0xA2,0xF0,0x53,0x10,0x19,0x09,0x3B,0x15,0x53,0x10,0x12,0x0B,0xFF,0xA1,
0xD1,0x10,0x00,0xA3,0xEA,0x1E,0x0E,0x0B,0xA4,0xF0,0xE2,0x10,0x00,0xA7,0xF2,0x1F,
0x0C,0x0B,0x12,0x60,0xE2,0x10,0xF0,0x6D,0x98,0x8E,0x80,0x00,0xD8,0x8E,0x80,0x00,
0x90,0xE2,0x00,0x00,0xAC,0x8E,0x80,0x00,0xF8,0x8E,0x80,0x00,0xCC,0x8E,0x80,0x00,
0xD4,0x8E,0x80,0x00,0xEC,0x8E,0x80,0x00,0x64,0x93,0x80,0x00,0xE8,0x93,0x80,0x00,
0xA8,0x8E,0x80,0x00,0xF0,0x8E,0x80,0x00,0xF4,0x8E,0x80,0x00,0x48,0x93,0x80,0x00,
0x7C,0x93,0x80,0x00,0xE8,0x8E,0x80,0x00,0xFC,0x8E,0x80,0x00,0xD0,0x8E,0x80,0x00,
0xF0,0x65,0x51,0x0B,0x88,0x60,0x06,0x31,0x1B,0x58,0x05,0x30,0x06,0x28,0x06,0x38,
0x76,0xB3,0x19,0x28,0x00,0x28,0x14,0xEC,0x49,0xF9,0x02,0x30,0x00,0xAE,0x01,0xC0,
0x00,0xA9,0x03,0xC1,0x49,0x0B,0xA2,0xF0,0x00,0xA0,0xD0,0x10,0x47,0x0A,0xA3,0xF0,
0x94,0x06,0x98,0x18,0x02,0x3A,0x12,0xF4,0x37,0xF4,0x45,0x0D,0x04,0x32,0x00,0xA8,
0x05,0xC1,0x3F,0xE4,0x60,0x06,0x12,0xE4,0x1F,0x10,0xEA,0x10,0x7A,0x80,0x00,0xF4,
0x02,0xFC,0xED,0x1A,0x3F,0xE4,0x03,0xE4,0x07,0x32,0x04,0x3A,0xFB,0xEA,0xD8,0xE7,
0x12,0xE4,0x1B,0xE8,0x04,0x32,0x43,0x00,0x2A,0xF4,0x04,0x38,0x12,0xE4,0x82,0xEA,
0xD0,0xE7,0x12,0xE8,0x03,0x35,0x42,0x00,0x8B,0x02,0x02,0xC9,0x14,0xA5,0x8A,0x02,
0x39,0xC8,0xD3,0xE8,0x1A,0xF1,0xD3,0xEA,0x58,0xF0,0xFE,0x97,0x0B,0x9E,0x85,0xEE,
0x05,0xA8,0x03,0xC8,0x00,0xA5,0x02,0xA8,0x00,0xC9,0x45,0xEE,0xB4,0xA3,0x00,0x33,
0xA7,0xA3,0x01,0x33,0xB9,0xA0,0xB9,0xA1,0x3A,0xEC,0x04,0x3B,0x01,0x90,0xFE,0x9D,
0x00,0xF6,0x00,0xFE,0x01,0xA8,0x04,0xC1,0x26,0x0B,0xA2,0xF0,0xD3,0x18,0x9B,0xF8,
0x15,0x80,0x02,0xA8,0x04,0xC1,0x23,0x0B,0xA2,0xF0,0xD3,0x18,0xDB,0xF8,0x0E,0x80,
0x2B,0xA3,0x63,0x03,0x20,0x0A,0xD3,0xE8,0x05,0xB3,0xDB,0x4F,0x01,0xAB,0x07,0xC9,
0x1C,0x0B,0xA2,0xF0,0xD3,0x18,0x07,0xA2,0x9A,0x02,0x9B,0x01,0x5B,0x02,0xED,0xE8,
0x14,0xAD,0x00,0xC9,0x14,0xA5,0x1F,0xA2,0x02,0x38,0x6B,0xEC,0x55,0xEB,0x07,0x3A,
0x36,0xF4,0x11,0xF4,0x02,0xF4,0x03,0x38,0x12,0xE4,0x36,0xE4,0x09,0xE4,0x5E,0x03,
0x69,0x03,0x53,0x03,0x02,0xF4,0x12,0xE4,0x55,0x03,0x71,0xE8,0x10,0xB1,0x05,0x3A,
0xC9,0xF2,0x5B,0xE9,0x09,0xFC,0x10,0xB3,0x11,0x20,0xDB,0xF2,0x07,0x0A,0x06,0x38,
0x09,0xF4,0x1B,0xFC,0xA4,0xF0,0x09,0xE4,0x03,0x20,0xA1,0x10,0x1B,0xF4,0x04,0x0A,
0x1B,0xE4,0xA3,0x10,0x08,0x60,0xF0,0x6D,0x7C,0x93,0x80,0x00,0x04,0x8F,0x80,0x00,
0x08,0x8F,0x80,0x00,0x00,0x8F,0x80,0x00,0x4C,0x8F,0x80,0x00,0x30,0x65,0x02,0xEC,
0x00,0xA3,0x01,0x80,0x52,0xE0,0x01,0xB3,0x1F,0xAA,0xFB,0xCC,0x11,0xEC,0x99,0x00,
0x41,0xEA,0x09,0xAB,0x03,0xCD,0x18,0xEC,0x0A,0xB8,0x01,0x01,0x02,0x80,0x0A,0xA0,
0xC0,0xEA,0x81,0x00,0x08,0xEC,0x0C,0x0C,0x51,0xF0,0x01,0xB2,0x52,0xF0,0x09,0x1F,
0x12,0x1F,0x52,0xEA,0x42,0x03,0x92,0xE2,0x52,0xE8,0xD9,0xF7,0x05,0xC5,0x07,0x09,
0x4A,0x03,0x80,0xA5,0xED,0xF1,0x52,0xE9,0xD2,0xE3,0x58,0xE0,0x80,0xA1,0x82,0x00,
0x09,0xF1,0x50,0xE8,0x00,0xE3,0x30,0x6D,0x04,0x8D,0x80,0x00,0x05,0xB5,0x00,0x00,
0xF0,0x65,0x82,0x60,0x01,0x30,0x15,0xF4,0x18,0xF4,0x01,0x3B,0x2C,0xE4,0x00,0xE4,
0x2D,0xFC,0x1F,0x28,0x28,0xEA,0x00,0xF4,0x00,0xE4,0x0E,0xEC,0x3F,0xF4,0x00,0xA3,
0xC9,0x1E,0x02,0xEC,0x3F,0xE4,0x09,0xEB,0x50,0x03,0x3A,0xEB,0x00,0x32,0x0A,0xEC,
0x51,0x03,0x00,0x3A,0x13,0xEC,0x53,0x03,0xC9,0xE8,0x81,0x02,0x23,0xCB,0x80,0xF3,
0xFE,0x97,0x4C,0x9D,0xFF,0x97,0xAA,0x9F,0xA7,0x02,0x06,0xCA,0xE7,0xEB,0x47,0x03,
0x01,0x3B,0xFF,0xF9,0xEF,0xEB,0x1F,0x20,0x06,0x80,0x00,0x3A,0x13,0xEC,0x43,0x03,
0x01,0x3A,0xDB,0xF9,0xEB,0xE8,0x13,0x20,0x33,0x28,0x1B,0xF4,0x1B,0xE4,0xA3,0x02,
0x04,0xCA,0xE4,0xEA,0x60,0x03,0xC0,0xF9,0x2D,0xEA,0x03,0x80,0x1C,0xEB,0x60,0x03,
0xC0,0xF9,0x2D,0xE8,0x35,0x20,0x02,0x60,0xF0,0x6D,0xC0,0x46,0xF0,0x65,0x58,0x0B,
0x08,0xA2,0x1A,0x40,0x57,0x0B,0x1D,0x58,0x2B,0xEC,0x08,0xB3,0xDA,0x2F,0x56,0x0B,
0x10,0xF7,0x99,0xED,0xC0,0xFF,0xC8,0x47,0x96,0xFA,0x22,0xB1,0x0E,0x40,0x91,0xF5,
0x89,0xFE,0x09,0xF6,0x0C,0xFE,0x29,0xA7,0xFC,0x14,0x07,0xA7,0x17,0x00,0xDA,0xED,
0xD7,0x47,0x4E,0x0A,0x34,0xEB,0xD4,0x47,0x2A,0xEC,0x4C,0xB2,0x17,0x28,0x3A,0xFA,
0x5A,0x42,0x1F,0x42,0x2A,0xEC,0x4E,0xB2,0x14,0x28,0x83,0x60,0x01,0x34,0x12,0x48,
0x9A,0x42,0x22,0xFA,0xDA,0x42,0x2A,0xEC,0x48,0xB2,0x14,0x48,0x9C,0x44,0x52,0x48,
0xDA,0x44,0x2A,0xEC,0x4A,0xB2,0x14,0x48,0x1C,0x44,0x52,0x48,0x1C,0xEC,0x5A,0x44,
0x2A,0xB4,0x4A,0xFE,0x22,0x40,0x2B,0xB3,0x00,0xA8,0x02,0xC0,0x89,0xFE,0x19,0x40,
0x00,0x80,0x1A,0x40,0x38,0x0C,0x72,0xA3,0x01,0xA0,0x23,0x43,0xA3,0x43,0x60,0x43,
0xE0,0x43,0x2B,0xEC,0x64,0xB3,0x1B,0x48,0x3F,0xA2,0x1A,0x00,0x63,0xED,0xDA,0x47,
0x00,0xA6,0x1E,0xA3,0xE6,0x45,0xA3,0x45,0x2B,0xEC,0x8E,0xB3,0x18,0x28,0x82,0xF9,
0xFF,0xA3,0x11,0xEC,0x19,0x00,0x18,0x00,0x12,0xFA,0x00,0x31,0x21,0x47,0x62,0x47,
0x02,0x30,0xA0,0x46,0x00,0xA0,0xE0,0x46,0x28,0xEC,0x8A,0xB0,0x00,0x28,0x80,0xF9,
0x01,0xEC,0x19,0x00,0x00,0xFA,0xA1,0x47,0xE0,0x47,0x28,0xEC,0x8C,0xB0,0x00,0x28,
0x03,0x00,0x60,0xEC,0xC3,0x47,0xA3,0xEC,0x00,0xA0,0xD8,0x47,0x6B,0x06,0x1B,0x48,
0x62,0x45,0x23,0x45,0x68,0x06,0x08,0xA1,0x08,0x1C,0x00,0xA1,0x20,0x46,0x61,0x46,
0x01,0x3A,0xB9,0xA1,0x50,0xF3,0x49,0xF0,0xB9,0xB0,0xFE,0x97,0x9F,0x9C,0x03,0xFA,
0x20,0x41,0x63,0x41,0x7F,0xF3,0x03,0xFC,0x00,0xFE,0xE0,0x41,0xB9,0xA1,0x38,0xEC,
0xA3,0x41,0x49,0xF0,0xB9,0xB0,0xFE,0x97,0x91,0x9C,0x03,0xFA,0x63,0x40,0x03,0xFC,
0x20,0x40,0xA3,0x40,0x00,0xFE,0xE3,0xEC,0x20,0xA2,0xE0,0x40,0xDA,0x47,0x23,0xED,
0x03,0xA2,0xDA,0x47,0x7A,0xB5,0x2B,0x48,0x0F,0xA2,0x13,0x00,0x2C,0xB4,0x23,0x40,
0x07,0x0B,0x01,0xA4,0x03,0x60,0x5C,0x40,0x1E,0x40,0xDE,0x45,0x5E,0x46,0xF0,0x6D,
0x83,0x00,0x80,0x00,0x7C,0x93,0x80,0x00,0x6C,0x90,0x80,0x00,0x74,0x90,0x80,0x00,
0x2C,0x8F,0x80,0x00,0x10,0x65,0x0E,0x0C,0x0E,0x09,0x20,0x58,0xFE,0x97,0xD0,0x9D,
0x00,0xA8,0x14,0xC0,0x0C,0x0B,0x5A,0x48,0x00,0xAA,0x06,0xC0,0x1A,0x48,0x00,0xAA,
0x03,0xC0,0x9B,0x2B,0xA2,0x28,0x9A,0x02,0x09,0xC0,0x08,0x0B,0x66,0xA2,0x1A,0x40,
0x05,0x0B,0x9A,0x2B,0x02,0x0B,0x9A,0x20,0x05,0x0A,0x12,0x58,0x1A,0x50,0x10,0x6D,
0x70,0x8E,0x80,0x00,0x40,0x42,0x0F,0x00,0x2C,0x8F,0x80,0x00,0x0F,0x04,0x80,0x00,
0x34,0x06,0x80,0x00,0x10,0x65,0xFF,0x97,0x2B,0x98,0xFF,0x97,0x8B,0x98,0x01,0x90,
0xAB,0x9C,0x0C,0x0C,0x80,0xA1,0x20,0xEC,0x09,0xF2,0xCC,0xA2,0x01,0x90,0x69,0x9C,
0x20,0xEC,0xCC,0xA1,0x01,0x90,0x7A,0x9C,0x00,0xA8,0x04,0xC1,0xFF,0x97,0x06,0x9F,
0xFF,0x97,0xDC,0x98,0x02,0x80,0x00,0xA3,0x23,0x20,0x63,0x20,0xFF,0x97,0x14,0x99,
0x10,0x6D,0xC0,0x46,0x00,0x9E,0x80,0x00,0x10,0x65,0xFF,0x97,0xDB,0x9F,0x06,0x0C,
0x03,0x80,0xFF,0x97,0xAF,0x9F,0xFF,0x97,0x63,0x99,0x63,0x48,0x00,0xAB,0xF8,0xC0,
0x00,0x90,0x24,0x98,0x10,0x6D,0xC0,0x46,0x2C,0x8F,0x80,0x00,0x10,0x65,0x0A,0x0B,
0x1B,0x48,0x05,0xAB,0x02,0xC1,0x09,0x0B,0xFF,0xA2,0x1A,0x40,0x08,0x0B,0x1A,0x58,
0x08,0x0B,0x09,0x0C,0x1A,0x50,0x00,0xA3,0x23,0x40,0x64,0xA0,0x01,0xA1,0xFE,0x97,
0x59,0x9F,0x08,0xA3,0x23,0x40,0x10,0x6D,0x03,0x00,0x80,0x00,0x80,0x9F,0x80,0x00,
0x34,0x06,0x80,0x00,0x68,0x90,0x80,0x00,0x83,0x00,0x80,0x00,0xF0,0x65,0xFE,0x97,
0xD7,0x9C,0x87,0x0B,0x00,0xA2,0x1A,0x41,0xDA,0x46,0x64,0xA2,0x1A,0x46,0x84,0x0B,
0x5B,0x4D,0x00,0xAB,0xFB,0xC0,0x83,0x0B,0x1B,0x58,0xDB,0x28,0x1B,0xFB,0x9C,0x06,
0x81,0x0B,0x00,0xA2,0x1A,0x20,0x81,0x0B,0x28,0xB3,0x1A,0x48,0x00,0xA1,0x57,0xF0,
0x00,0xA3,0x7F,0x08,0x1E,0x80,0x7F,0x0C,0x7F,0x0E,0xE5,0x1A,0xF4,0x1A,0x2D,0xEB,
0x2D,0xF4,0x2D,0xFC,0x7D,0x0E,0x2C,0xF4,0x24,0xE4,0xF5,0x12,0x00,0xAC,0x0D,0xCD,
0x26,0xEC,0x64,0x06,0x74,0x03,0xE4,0xE0,0x2C,0xE9,0x24,0xF4,0x24,0xFC,0xC4,0x12,
0xB4,0xAC,0x06,0xC9,0x01,0xB1,0x09,0xF4,0x09,0xFC,0x02,0x80,0xC4,0xE8,0x00,0xA5,
0x25,0x20,0x02,0xB3,0xBB,0x02,0xDE,0xC1,0x6B,0x0B,0x19,0x20,0x68,0x0B,0x09,0xF6,
0x09,0xFE,0x19,0x45,0x6E,0x0B,0x1B,0x48,0x01,0xAB,0x04,0xC1,0x52,0xF0,0x6D,0x08,
0x67,0x09,0x01,0x90,0xD6,0x9B,0x62,0x0B,0x1A,0x4D,0x00,0xAA,0x0B,0xC1,0xD9,0x4D,
0xA8,0xA9,0x02,0xC9,0x01,0xA2,0x5A,0x46,0x1F,0x80,0xD9,0x4D,0x01,0xB1,0x09,0xF6,
0x09,0xFE,0xD9,0x45,0x01,0x80,0x00,0xA2,0xDA,0x45,0x5A,0x46,0xFE,0x97,0x78,0x9C,
0x01,0x90,0xC4,0x9C,0x00,0x90,0xEC,0x99,0x00,0x90,0x7E,0x9C,0x00,0x90,0x84,0x9F,
0x54,0x0B,0x1B,0x58,0x72,0xB3,0x1B,0x28,0xD8,0xF6,0x02,0xC5,0x5A,0x08,0x00,0x90,
0xC7,0x98,0x00,0x90,0xD4,0x98,0x01,0x90,0x01,0x9C,0x4D,0x0B,0x5A,0x4D,0x00,0xAA,
0xFC,0xC0,0xDB,0x4E,0x00,0xAB,0x08,0xC0,0x54,0x0B,0x55,0x09,0x18,0x58,0xFE,0x97,
0xD7,0x9C,0x00,0xA8,0x01,0xC0,0xFF,0x97,0x59,0x9F,0x45,0x0B,0x5A,0x4E,0x01,0xAA,
0x1C,0xC1,0x4B,0x0B,0x1B,0x48,0x05,0xAB,0x08,0xC1,0x4E,0x08,0xFE,0x97,0xA4,0x9B,
0x4A,0x0B,0x4D,0x09,0x1A,0x58,0x52,0xE8,0x1A,0x50,0x43,0x80,0x4B,0x08,0x00,0xA1,
0xFE,0x97,0xB0,0x9E,0xFE,0x97,0x3C,0x9C,0x3A,0x0B,0x1B,0x58,0x7A,0xB3,0x1B,0x48,
0x0F,0xA2,0x1A,0x00,0x39,0x0B,0x01,0xBA,0x2C,0xB3,0x2B,0x80,0x5A,0x4E,0x00,0xAA,
0x2A,0xC1,0xD9,0x48,0x00,0xA9,0x0C,0xC0,0xD9,0x48,0x01,0xB9,0x09,0xF6,0x09,0xFE,
0xD9,0x40,0x01,0xA1,0x19,0x41,0x3E,0x0B,0x1A,0x40,0x3E,0x0B,0x1A,0x58,0x37,0x0B,
0x1A,0x50,0x2B,0x0B,0x1A,0x49,0x01,0xAA,0x02,0xC1,0x52,0xA0,0x01,0xA1,0x07,0x80,
0x1B,0x4D,0x00,0xAB,0x02,0xC0,0x52,0xA0,0x00,0xA1,0x01,0x80,0xB6,0xA0,0x02,0xA1,
0xFE,0x97,0x80,0x9E,0x22,0x0B,0x1A,0x49,0x01,0xAA,0x0B,0xC1,0x00,0xA2,0x1A,0x41,
0x2F,0x0B,0x08,0xA2,0x1A,0x40,0x05,0x80,0x5B,0x4E,0x02,0xAB,0x02,0xC1,0x2E,0x08,
0xFE,0x97,0x5A,0x9B,0x1A,0x0B,0x19,0x4F,0x5A,0x4F,0x12,0xF2,0x0A,0x03,0x01,0xB2,
0xFF,0xA0,0x11,0xF4,0x02,0x00,0x18,0x4F,0x1A,0x47,0x0A,0xFE,0x59,0x4F,0x5A,0x47,
0x1A,0x4E,0x00,0xAA,0x04,0xC0,0x1A,0x4E,0x01,0xBA,0x12,0xF6,0x12,0xFE,0x1A,0x46,
0x0F,0x0B,0xDA,0x4B,0x5A,0x43,0xFE,0x97,0x2F,0x9D,0x20,0x0B,0x66,0xA2,0x1A,0x40,
0x13,0x0B,0x1A,0x48,0x01,0xAA,0x06,0xC1,0x01,0x90,0xE2,0x9C,0x01,0x90,0x1C,0x9D,
0x01,0x90,0x50,0x9C,0x07,0x80,0x1B,0x48,0xFF,0xAB,0x04,0xC1,0x01,0x90,0xD8,0x9C,
0x01,0x90,0x12,0x9D,0xF0,0x6D,0x64,0xA0,0xFE,0x97,0x92,0x9D,0xF7,0x86,0xC0,0x46,
0x2C,0x8F,0x80,0x00,0x7C,0x93,0x80,0x00,0x7C,0x92,0x80,0x00,0x6C,0x90,0x80,0x00,
0x5C,0x91,0x80,0x00,0xFC,0x90,0x80,0x00,0x9C,0x90,0x80,0x00,0x1C,0x92,0x80,0x00,
0x03,0x00,0x80,0x00,0xBC,0x91,0x80,0x00,0xE0,0x93,0x80,0x00,0x68,0x90,0x80,0x00,
0xC0,0xFB,0x39,0x00,0x14,0x05,0x00,0x00,0x80,0xB0,0xED,0xFF,0xF3,0x01,0x00,0x00,
0x83,0x00,0x80,0x00,0x34,0x06,0x80,0x00,0x89,0xA9,0x03,0x00,0x0F,0x04,0x80,0x00,
0x70,0x65,0x06,0x49,0x84,0xEC,0x05,0xEC,0x32,0xEC,0x21,0xEC,0xFF,0x97,0x60,0x9C,
0x28,0xEC,0x32,0xEC,0x21,0xEC,0x00,0xA3,0xFF,0x97,0x7A,0x98,0x70,0x6D,0xF0,0x65,
0x2E,0x0B,0x1B,0x58,0x76,0xB3,0x1B,0x48,0x1B,0xF6,0x1A,0xFF,0x1B,0xF1,0x84,0x60,
0x1B,0xFF,0x00,0x32,0x00,0xA6,0x01,0x33,0x49,0x80,0x77,0xF0,0x28,0x0B,0xBF,0xE9,
0x7F,0xF0,0xDD,0xE9,0x27,0x0C,0x6A,0x48,0xF9,0x1C,0x12,0xF2,0x63,0x48,0x0A,0x03,
0x21,0x48,0x1B,0xF2,0x0B,0x03,0xA1,0x48,0x09,0xF4,0x0B,0x03,0xE1,0x48,0x12,0xF4,
0x09,0xF6,0x12,0xE4,0x0B,0x03,0x53,0x03,0x1F,0x0A,0x9B,0xE8,0x5B,0xFB,0x03,0x33,
0xEA,0x48,0xA9,0x48,0x63,0x49,0x12,0xF2,0x0A,0x03,0x21,0x49,0x1B,0xF2,0x0B,0x03,
0xA1,0x49,0x09,0xF4,0x0B,0x03,0xE1,0x49,0x12,0xF4,0x09,0xF6,0x12,0xE4,0x0B,0x03,
0x53,0x03,0x15,0x0A,0x9B,0xE8,0x5B,0xFB,0x02,0x33,0xE1,0x4A,0xA3,0x4A,0x09,0xF2,
0x19,0x03,0x00,0x3A,0x02,0x78,0xFE,0x97,0xAC,0x9B,0x61,0x4A,0x23,0x4A,0x09,0xF2,
0x19,0x03,0x01,0x3A,0x03,0x78,0xFE,0x97,0xA4,0x9B,0x03,0x3B,0x08,0x0A,0xD3,0x15,
0x1B,0xFA,0x6B,0x40,0x02,0x3B,0xAB,0x40,0x1B,0xFA,0xEB,0x40,0x01,0xB6,0x07,0x0A,
0xD3,0x4B,0x9E,0x02,0xB1,0xCB,0x04,0x60,0xF0,0x6D,0xC0,0x46,0x7C,0x93,0x80,0x00,
0xE0,0x93,0x80,0x00,0x6C,0x90,0x80,0x00,0xFF,0x0F,0x00,0x00,0x2C,0x8F,0x80,0x00,
0xF0,0x65,0x4E,0x0A,0x55,0x28,0x16,0x28,0x2B,0xF1,0x5B,0xEB,0x9B,0xE9,0x9E,0x60,
0x9B,0xE0,0x09,0x33,0x33,0xF1,0x9B,0xEB,0x5B,0xE9,0x9B,0xE0,0x0A,0x33,0x90,0x2A,
0x94,0x28,0x03,0xF1,0x1B,0xEA,0x1B,0xE9,0x9B,0xE0,0x0B,0x33,0x23,0xF1,0x1B,0xEB,
0x1B,0xE8,0x9B,0xE0,0x0C,0x33,0x93,0x2B,0x91,0x29,0x03,0x33,0x03,0x3F,0x1B,0xF1,
0xDB,0xEB,0x5B,0xE8,0x9B,0xE0,0x0D,0x33,0x0B,0xF1,0x5B,0xEA,0xDB,0xE9,0x9B,0xE0,
0x0E,0x33,0xD3,0x2B,0x04,0x33,0x17,0x2C,0x3B,0xF1,0x05,0x37,0xDB,0xEB,0x04,0x3F,
0xDB,0xE9,0x9B,0xE0,0x0F,0x33,0x3B,0xF1,0xDB,0xEB,0x05,0x3F,0xDB,0xE9,0x9B,0xE0,
0x10,0x33,0x00,0xA3,0x07,0x33,0x4A,0x80,0x00,0xAB,0x01,0xC0,0x04,0xAB,0x03,0xC1,
0x04,0xAA,0x37,0xC0,0x00,0xAA,0x35,0xC0,0x91,0xEE,0x08,0xEC,0x41,0x02,0x41,0x01,
0x00,0xA9,0x06,0xC0,0x00,0xAB,0x04,0xC1,0x09,0x3F,0xAE,0x02,0x2B,0xC8,0x0A,0x3F,
0x29,0x80,0x00,0xAA,0x08,0xC1,0x08,0x3F,0x00,0xAF,0x05,0xC0,0x02,0x38,0x0B,0x3F,
0x84,0x02,0x20,0xC8,0x0C,0x3F,0x1E,0x80,0x04,0xAA,0x09,0xC1,0x08,0x3F,0x00,0xAF,
0x06,0xC0,0x01,0x38,0x03,0x39,0x0D,0x3F,0x88,0x02,0x14,0xC8,0x0E,0x3F,0x12,0x80,
0x00,0xA9,0x08,0xC0,0x04,0xAB,0x06,0xC1,0x04,0x38,0x05,0x39,0x0F,0x3F,0x88,0x02,
0x09,0xC8,0x10,0x3F,0x07,0x80,0x07,0x38,0x14,0x09,0x47,0xF0,0x01,0xB0,0x7F,0x1A,
0x07,0x30,0x00,0x80,0x00,0xA7,0x06,0x38,0x01,0xB2,0x07,0x20,0x02,0xB0,0x06,0x30,
0x05,0xAA,0xB9,0xC1,0x01,0xB3,0x02,0x38,0x01,0x39,0x05,0xAB,0x0F,0xC0,0x9A,0xF0,
0xD2,0xE8,0x52,0xF0,0x11,0x7F,0xBF,0xE8,0x06,0x37,0x00,0xA2,0x9F,0xEE,0x00,0x32,
0x7A,0x02,0x7A,0x01,0x08,0x32,0x02,0x30,0x01,0x31,0x00,0xA2,0xA4,0x87,0x11,0x79,
0x02,0x08,0x32,0xA2,0x01,0x90,0xD5,0x99,0x1E,0x60,0xF0,0x6D,0x5C,0x91,0x80,0x00,
0xF0,0x65,0xB4,0x0E,0xB4,0x0C,0x00,0xA3,0x8A,0x60,0x33,0x40,0x20,0xEC,0x19,0xA1,
0xFE,0x97,0xA2,0x9A,0x18,0xA8,0x00,0xCD,0x59,0x81,0x40,0xF0,0x03,0x1B,0xBD,0xAB,
0x00,0xC8,0x54,0x81,0xFF,0x97,0x4C,0x9F,0x20,0xEC,0x19,0xA1,0xFE,0x97,0x94,0x9A,
0x05,0xEC,0x18,0xA8,0x00,0xCD,0x4A,0x81,0x43,0xF0,0x1B,0x1B,0xBD,0xAB,0x00,0xC8,
0x45,0x81,0xA6,0x0A,0x11,0xEC,0x80,0xB1,0x0B,0x40,0x81,0xB2,0x1B,0xFA,0x13,0x40,
0x01,0xA3,0x33,0x40,0xA2,0x0B,0x05,0xA1,0x18,0x50,0xFE,0x97,0x6F,0x99,0x00,0xF6,
0x00,0xFE,0x83,0xF1,0x9F,0x0E,0x1B,0xEA,0x9B,0xF0,0x9F,0x0C,0x30,0x40,0x18,0xEA,
0x9E,0x0B,0x40,0xE9,0x18,0x40,0x19,0xA2,0x20,0xEC,0x00,0xA1,0xFE,0x97,0xB7,0x9A,
0x63,0xE9,0x1A,0x48,0x01,0xA7,0x38,0xEC,0x02,0x03,0x1A,0x40,0x33,0x48,0x00,0xAB,
0x06,0xC0,0x6A,0xEF,0xA2,0xE8,0x11,0x48,0x0F,0x03,0x17,0x40,0x03,0xAB,0x05,0xC8,
0x6B,0xED,0xE3,0xE8,0x19,0x48,0x01,0xA2,0x0A,0x03,0x1A,0x40,0x8F,0x0B,0x1B,0x48,
0x00,0xAB,0x07,0xC0,0x6A,0xEE,0xA2,0xE8,0x10,0x48,0x01,0xA1,0x01,0x03,0x11,0x40,
0x03,0xAB,0x05,0xC8,0x01,0xB5,0x65,0xE9,0x2A,0x48,0x01,0xA3,0x13,0x03,0x2B,0x40,
0x84,0x0B,0x1A,0x48,0x85,0x0B,0x19,0x48,0x93,0xF0,0x9B,0xE8,0x5B,0xE8,0x1D,0xEF,
0x9E,0xEF,0x58,0xEF,0x01,0x35,0x40,0xF0,0x02,0x36,0x5E,0xEE,0x03,0x36,0x08,0x30,
0x1E,0xED,0x01,0x38,0x5D,0xEC,0x04,0x36,0x5E,0xED,0x05,0x36,0x6D,0xF0,0x76,0x0E,
0x40,0xF0,0x06,0xB3,0x07,0x35,0x09,0x30,0x06,0x33,0xB4,0x06,0x00,0xA3,0x00,0xAB,
0x11,0xC1,0x04,0xA9,0x01,0xC1,0x01,0xA3,0x11,0x80,0x00,0xAA,0x01,0xC1,0x01,0xA3,
0x0B,0x80,0x07,0x3D,0x66,0x06,0xAD,0x1B,0x08,0x38,0x00,0x35,0x87,0x1B,0x09,0x38,
0x85,0x1B,0x01,0x38,0x33,0x80,0x01,0xAB,0x0E,0xC1,0x00,0xA9,0x10,0xC0,0x00,0xAA,
0x01,0xC1,0x02,0xA3,0x0A,0x80,0x03,0x3E,0x63,0x08,0x75,0xF0,0x2D,0x1A,0x00,0x35,
0x08,0x3D,0x02,0x3E,0x2F,0x1A,0x1F,0x80,0x02,0xAB,0x11,0xC1,0x00,0xA9,0x01,0xC1,
0x03,0xA3,0x0F,0x80,0x04,0xAA,0x01,0xC1,0x03,0xA3,0x09,0x80,0x03,0x3E,0x5A,0x08,
0x75,0xF0,0x2D,0x1A,0x05,0x3E,0x00,0x35,0x75,0xF0,0x2F,0x1A,0x04,0x3E,0x0B,0x80,
0x04,0xA9,0x19,0xC0,0x04,0xAA,0x17,0xC0,0x53,0x08,0x07,0x3D,0x2D,0x1A,0x05,0x3E,
0x00,0x35,0x75,0xF0,0x2F,0x1A,0x06,0x3E,0x75,0xF0,0x2D,0x1A,0x30,0xEC,0x00,0x3E,
0xBF,0xE9,0xBD,0x02,0x08,0xCC,0x00,0xA8,0x06,0xCB,0x4F,0x0D,0x40,0xE9,0x05,0x48,
0x00,0xAD,0x01,0xC1,0x01,0xA5,0x05,0x40,0x01,0xB3,0x04,0xAB,0xA7,0xC1,0x02,0xBA,
0x1B,0xC4,0x90,0xF0,0x4B,0xEE,0x82,0xE8,0xD2,0xE8,0x43,0x0D,0xA0,0xE8,0x52,0xF0,
0x52,0xE9,0x01,0xB1,0x01,0xA5,0x00,0xAB,0x09,0xCB,0x04,0xAB,0x0D,0xCC,0x06,0x48,
0x00,0xAE,0x04,0xC1,0x17,0x28,0x56,0x29,0xB7,0x02,0x00,0xC2,0x05,0x40,0x01,0xB0,
0x02,0xB2,0x8B,0x02,0x01,0xC0,0x01,0xB3,0xED,0x87,0x3C,0x0B,0x18,0x48,0x39,0x0B,
0x1A,0x48,0x02,0xB2,0x04,0xAA,0x1C,0xCC,0x91,0xF0,0x43,0xEE,0x8A,0xE8,0xD2,0xE8,
0x31,0x0D,0xA1,0xE8,0x05,0xBA,0x52,0xF0,0x52,0xE9,0x01,0xB0,0x01,0xA5,0x00,0xAB,
0x09,0xCB,0x04,0xAB,0x0D,0xCC,0x0E,0x48,0x00,0xAE,0x04,0xC1,0x57,0x29,0x16,0x28,
0xB7,0x02,0x00,0xC2,0x0D,0x40,0x01,0xB1,0x02,0xB2,0x83,0x02,0x01,0xC0,0x01,0xB3,
0xED,0x87,0x2A,0x0B,0x1A,0x48,0x02,0xBA,0x1D,0xC4,0x26,0x0B,0x18,0x48,0x43,0xEE,
0x99,0xF0,0xC9,0xE8,0x8A,0xE8,0x20,0x0D,0xA1,0xE8,0x52,0xF0,0x52,0xE9,0x01,0xB0,
0x01,0xA5,0x5E,0xEC,0x09,0xC0,0x04,0xAB,0x0D,0xCC,0x0E,0x48,0x00,0xAE,0x04,0xC1,
0x17,0x28,0x56,0x28,0xB7,0x02,0x00,0xC2,0x0D,0x40,0x05,0xB1,0x0A,0xB2,0x83,0x02,
0x01,0xC0,0x01,0xB3,0xED,0x87,0x19,0x0B,0x18,0x48,0x02,0xB0,0x04,0xA8,0x1E,0xCC,
0x14,0x0B,0x19,0x48,0x4B,0xEE,0x9A,0xF0,0xD2,0xE8,0x12,0xE8,0x0E,0x08,0xA4,0xE8,
0x52,0xF0,0x12,0xE8,0x01,0xB1,0x01,0xA0,0x5D,0xEC,0x0A,0xC0,0x04,0xAB,0x0E,0xCC,
0x25,0x48,0x00,0xAD,0x05,0xC1,0x95,0xEE,0x16,0x28,0x2D,0x28,0xAE,0x02,0x00,0xC2,
0x20,0x40,0x05,0xB4,0x0A,0xB2,0x8B,0x02,0x01,0xC0,0x01,0xB3,0xEC,0x87,0x0A,0x60,
0xF0,0x6D,0xC0,0x46,0x41,0x93,0x80,0x00,0x5C,0x91,0x80,0x00,0xA4,0x8F,0x80,0x00,
0x44,0x93,0x80,0x00,0x40,0x93,0x80,0x00,0x80,0x92,0x80,0x00,0x42,0x93,0x80,0x00,
0x10,0x65,0x09,0xF6,0x14,0xF4,0x09,0xFE,0x24,0xFC,0x04,0xA9,0x11,0xC0,0x03,0xA9,
0x0A,0xC8,0x02,0xA9,0x04,0xC0,0x01,0xA9,0x0B,0xC1,0x40,0xF2,0xFF,0x97,0x76,0x9A,
0x40,0xF2,0xFF,0x97,0x73,0x9A,0x04,0x80,0x08,0xA9,0x02,0xC1,0x03,0xEC,0x58,0x03,
0x40,0xFA,0x60,0x03,0x64,0xA1,0xFE,0x97,0x0D,0x98,0x80,0xA3,0x9B,0xF0,0xC0,0xE8,
0x10,0x6D,0xF0,0x65,0x8D,0x60,0x06,0x31,0x06,0x3A,0x07,0x28,0x13,0x28,0x75,0x09,
0x7F,0xE8,0x5B,0xE8,0x3F,0xF4,0x1B,0xF4,0x1B,0xFC,0x3F,0xFC,0x1D,0xF4,0x3C,0xF4,
0x24,0xE4,0x2D,0xE4,0x05,0x30,0x00,0x33,0x01,0x33,0x28,0xEC,0x68,0x03,0x23,0xEC,
0x63,0x03,0xC0,0xE8,0xFF,0x97,0x4A,0x9A,0x6B,0x0B,0x3E,0xEC,0x02,0x30,0x98,0x02,
0x00,0xC8,0xCD,0x80,0x00,0xAD,0x13,0xCA,0x00,0xAC,0x06,0xCA,0x7E,0x02,0xFF,0xA3,
0x36,0xF4,0x03,0x33,0x36,0xFC,0x02,0xA3,0x02,0x80,0x01,0xA1,0x03,0x31,0x01,0xA3,
0x00,0x39,0x4A,0x02,0x12,0xF4,0x12,0xFC,0x01,0x32,0xFF,0xA2,0x04,0x32,0xB0,0x80,
0x00,0xAC,0x00,0xCD,0xA9,0x80,0x7E,0x02,0x01,0xA3,0x36,0xF4,0xFF,0xA1,0x04,0x33,
0x36,0xFC,0x03,0x31,0x03,0xA3,0xA4,0x80,0x1C,0x48,0x0C,0x78,0x84,0x14,0x1C,0x49,
0x0B,0x78,0x84,0x14,0x1C,0x4A,0x09,0x78,0x44,0x12,0x1C,0x4B,0x07,0x78,0x01,0xB2,
0x44,0x12,0x01,0xB3,0x02,0xB1,0x04,0xAA,0xEE,0xC1,0x01,0x3A,0x37,0xF4,0x13,0xF4,
0x1B,0xE4,0x3F,0xE4,0x00,0x33,0x9F,0x02,0x19,0xCA,0x78,0xF2,0x19,0xEC,0xFD,0x97,
0xA9,0x9F,0x01,0xA5,0x04,0xEC,0xFF,0xA8,0x2D,0xC8,0x00,0xAE,0x0B,0xC0,0x00,0x3B,
0x39,0xEC,0x58,0xF2,0xFD,0x97,0x9E,0x9F,0xA0,0xA3,0x5B,0xF1,0x04,0xEC,0x00,0xA5,
0x98,0x02,0x1F,0xC8,0x01,0x80,0xA0,0xA4,0x64,0xF1,0x00,0xA5,0x1B,0x80,0x00,0x39,
0x48,0xF2,0x39,0xEC,0xFD,0x97,0x8E,0x9F,0x02,0xA5,0x04,0xEC,0xFF,0xA8,0x12,0xC8,
0x01,0x3A,0x00,0xAA,0x0A,0xC0,0x78,0xF2,0x00,0x39,0xFD,0x97,0x83,0x9F,0xA0,0xA3,
0x5B,0xF1,0x04,0xEC,0x03,0xA5,0x98,0x02,0x04,0xC8,0x01,0x80,0xA0,0xA4,0x64,0xF1,
0x03,0xA5,0x00,0x80,0x1C,0xEC,0x0C,0x7B,0x59,0x1D,0x6F,0xF0,0x09,0x7B,0xFA,0x1A,
0x20,0xEC,0xFF,0x97,0x45,0x9F,0x00,0x30,0x0B,0x7B,0x59,0x1D,0x07,0x7B,0xFA,0x1A,
0x20,0xEC,0xFF,0x97,0x3D,0x9F,0x02,0x3B,0x1D,0xEC,0x28,0x0B,0x00,0x39,0xED,0xE8,
0x0B,0xEC,0x6B,0x03,0x26,0x0A,0x36,0xF4,0x9B,0xE8,0x36,0xE4,0x07,0xEC,0x02,0x39,
0x30,0xEC,0x58,0x03,0xFD,0x97,0x56,0x9F,0x7D,0x03,0x01,0x39,0x20,0x0B,0xC4,0xF1,
0x08,0xF4,0xED,0xE8,0x00,0xE4,0x68,0x03,0x02,0x39,0xFD,0x97,0x4B,0x9F,0xB9,0xA3,
0x24,0xFC,0xC0,0xF1,0xDB,0xF0,0x00,0xFC,0x22,0xEC,0x9C,0x02,0x00,0xC9,0x1A,0xEC,
0x03,0x39,0x0B,0xF6,0x1B,0xE6,0x11,0xEC,0x1A,0xEC,0x4A,0x03,0xB9,0xA3,0xDB,0xF0,
0xD2,0xE8,0x05,0x39,0xB9,0xA3,0xDB,0xF0,0x0A,0x20,0x02,0xEC,0x98,0x02,0x00,0xC9,
0x1A,0xEC,0x04,0x39,0x0B,0xF6,0x1B,0xE6,0x11,0xEC,0x1A,0xEC,0x4A,0x03,0xB9,0xA3,
0xDB,0xF0,0x06,0x39,0xD2,0xE8,0x0A,0x20,0x0A,0x80,0x01,0xA2,0x04,0x32,0x03,0x32,
0x04,0xA3,0x08,0x0A,0x01,0xBB,0x1B,0xF1,0xD3,0xE8,0x00,0xA1,0x00,0xA2,0x53,0x87,
0x0D,0x60,0xF0,0x6D,0x38,0xFA,0xFF,0xFF,0x56,0x04,0x00,0x00,0xAA,0xFB,0xFF,0xFF,
0x00,0xAC,0x08,0x00,0x30,0x01,0x00,0x00,0xF0,0x65,0xCD,0x0B,0x18,0x29,0x94,0x60,
0x00,0x30,0x9E,0x2A,0xCB,0x0B,0x00,0xA2,0xDA,0x43,0xCB,0x08,0x00,0xA1,0x19,0xA2,
0xFE,0x97,0x55,0x98,0xC9,0x0B,0x1B,0x48,0x00,0xAB,0x00,0xC1,0x85,0x81,0xC8,0x0D,
0x2C,0xEC,0x28,0xEC,0x00,0xA1,0x0C,0xA2,0x0C,0xB4,0xFE,0x97,0x48,0x98,0x20,0xEC,
0x00,0xA1,0x0C,0xA2,0xFE,0x97,0x43,0x98,0x00,0xA3,0x15,0x80,0x03,0x48,0x01,0xA7,
0x1F,0x02,0x06,0xC0,0x0F,0x28,0x13,0x28,0xFB,0xE8,0x13,0x20,0x23,0x28,0xFF,0xE8,
0x27,0x20,0xBC,0x0B,0x02,0xB2,0x01,0xB0,0x02,0xB1,0x9A,0x02,0xEE,0xC1,0x63,0x06,
0x05,0xB3,0x02,0xB4,0x19,0xAB,0x07,0xC0,0xB7,0x0F,0xD8,0xE9,0xB7,0x0F,0x59,0xF0,
0x2A,0xEC,0xC9,0xE9,0x9C,0x06,0xE1,0x87,0xB3,0x08,0x00,0xA1,0x19,0xA2,0xFE,0x97,
0x1E,0x98,0x00,0x38,0x00,0x3A,0x40,0xE0,0x71,0xE0,0xB1,0x0B,0xB1,0x0C,0x76,0xEA,
0x12,0xEA,0x00,0xA7,0x08,0x30,0x09,0x31,0x0C,0x36,0x0B,0x32,0x0A,0x33,0x0D,0x34,
0x06,0x37,0x00,0xA5,0x38,0x81,0x00,0xA0,0x10,0x7B,0x0D,0x3A,0x58,0x50,0x06,0x3B,
0x02,0xDA,0x10,0x30,0x18,0xEC,0xA2,0x0B,0x0E,0x31,0xC0,0xE8,0x05,0xA1,0x0D,0x32,
0xFD,0x97,0xB2,0x9F,0x9A,0x0F,0x01,0x30,0x02,0xB8,0x43,0xF0,0xFF,0xE8,0x01,0x3C,
0x6B,0xF0,0x5B,0xE9,0x5B,0xF0,0x03,0xB4,0xC2,0xE8,0x02,0x30,0x98,0x09,0x07,0x34,
0x04,0xEC,0x01,0x38,0x52,0xF0,0x00,0xA6,0x8A,0xE8,0x05,0x33,0x1B,0xE8,0x04,0x32,
0x00,0x36,0x03,0x33,0x33,0x80,0x04,0xAC,0x2C,0xC8,0x02,0x39,0x8C,0x02,0x04,0xC0,
0x04,0x38,0x03,0x28,0x94,0x02,0x1F,0xC1,0x0C,0x80,0x05,0x38,0x03,0x3A,0x8C,0x0B,
0x01,0xE9,0x01,0xBA,0x49,0xF0,0x52,0xF0,0xD2,0x1A,0xC8,0x1A,0x03,0x39,0x50,0x03,
0x4A,0xF0,0x07,0x80,0x03,0x39,0x86,0x0A,0x01,0xB1,0x49,0xF0,0x88,0x1A,0x03,0x39,
0x58,0x03,0x4B,0xF0,0x99,0x1A,0xFD,0x97,0x69,0x9E,0x3B,0x28,0x43,0x03,0x00,0x3A,
0x12,0xE8,0xF6,0xE8,0x00,0x32,0x05,0x80,0x3A,0x28,0x5A,0x03,0x00,0x38,0xC0,0xE8,
0x00,0x30,0xB6,0xE8,0x04,0x39,0x02,0xB1,0x04,0x31,0x01,0xB4,0x02,0xB7,0x01,0x3A,
0x07,0x3B,0x02,0xB2,0x9C,0x02,0xC6,0xC1,0x06,0x3C,0x20,0xEC,0x7A,0x0C,0x05,0xA1,
0x00,0xE9,0x10,0x36,0xFD,0x97,0x58,0x9F,0x10,0x7B,0x01,0x30,0x6C,0x0A,0x02,0xB8,
0x5F,0x58,0x43,0xF0,0xD3,0xE8,0x03,0x33,0x6B,0xF0,0x5B,0xE9,0x5B,0xF0,0xC2,0xE8,
0x02,0x30,0x01,0x39,0x01,0x38,0x52,0xF0,0xA4,0xE8,0x03,0xB0,0x07,0x33,0x5B,0xE8,
0x05,0x34,0x0F,0x30,0x02,0x3C,0x00,0xA6,0x04,0x33,0x39,0x80,0x04,0xAC,0x30,0xC8,
0x02,0x3B,0x9C,0x02,0x04,0xC0,0x05,0x38,0x03,0x28,0x94,0x02,0x24,0xC1,0x10,0x80,
0x07,0x38,0x04,0x3A,0x5E,0x0B,0x01,0xE9,0x01,0xBA,0x52,0xF0,0x49,0xF0,0x59,0xE8,
0x9A,0xE8,0x92,0x29,0x88,0x29,0x04,0x39,0x50,0x03,0x4A,0xF0,0x9B,0xE8,0x99,0x29,
0x0A,0x80,0x04,0x39,0x56,0x0A,0x01,0xB1,0x49,0xF0,0x51,0xE8,0x88,0x29,0x04,0x39,
0x58,0x03,0x4B,0xF0,0xD2,0xE8,0x91,0x29,0xFD,0x97,0x08,0x9E,0x03,0x3A,0x13,0x28,
0x43,0x03,0x36,0xE8,0xFF,0xE8,0x04,0x80,0x03,0x38,0x02,0x28,0x5A,0x03,0xF6,0xE8,
0xBF,0xE8,0x03,0x39,0x05,0x3A,0x02,0xB1,0x02,0xB2,0x03,0x31,0x05,0x32,0x01,0xB4,
0x01,0x3A,0x0F,0x3B,0x02,0xB2,0x9C,0x02,0xC0,0xC1,0x10,0x38,0x00,0x39,0xFD,0x97,
0xED,0x9D,0x04,0xEC,0x29,0xBC,0x38,0xEC,0xFF,0xBC,0x31,0xEC,0x10,0x34,0xFD,0x97,
0xE5,0x9D,0x08,0x3F,0x29,0xB8,0xFF,0xB8,0x11,0x30,0xBC,0x02,0x06,0xCA,0x3B,0xEB,
0x9A,0xF0,0xD3,0xE8,0x9B,0xF0,0xDB,0xE1,0xE4,0xEA,0x08,0x80,0x0B,0x39,0x8C,0x02,
0x06,0xCD,0x63,0xEA,0x9A,0xF0,0xD3,0xE8,0x9B,0xF0,0xDB,0xE1,0x1C,0xE9,0x10,0x34,
0x09,0x3A,0x90,0x02,0x06,0xCA,0x13,0xEA,0x9A,0xF0,0xD3,0xE8,0x9B,0xF0,0xDB,0xE1,
0xC0,0xEA,0x08,0x80,0x0C,0x3B,0x98,0x02,0x06,0xCD,0xC3,0xEA,0x9A,0xF0,0xD3,0xE8,
0x9B,0xF0,0xDB,0xE1,0x18,0xE8,0x11,0x30,0x10,0x3B,0x10,0x7C,0xA3,0x50,0x63,0x58,
0x12,0x78,0xE3,0x50,0x13,0x79,0xFF,0x97,0xAC,0x9D,0xA3,0x58,0x07,0xAB,0x01,0xCC,
0x08,0xA3,0xA3,0x50,0x10,0x7B,0xDA,0x58,0x07,0xAA,0x01,0xCC,0x08,0xA2,0xDA,0x50,
0x10,0x7B,0x99,0x58,0xDA,0x58,0xC9,0xE0,0xD2,0xE0,0x99,0x50,0xDA,0x50,0xAB,0xF0,
0x5B,0xE9,0x0E,0x3F,0x98,0xF0,0x1B,0xE8,0x17,0x08,0x7C,0xF0,0x1B,0x0F,0xC3,0xE8,
0xE7,0x1D,0x18,0xEC,0x08,0xB0,0x87,0x40,0x18,0x0F,0xE4,0xE9,0x64,0x48,0xC4,0x40,
0x00,0x3C,0x36,0xE9,0x1E,0x42,0x36,0xFA,0x46,0x40,0x18,0xED,0x19,0x41,0x82,0x40,
0x09,0xFA,0x12,0xFA,0x41,0x40,0xC2,0x40,0x0A,0x3F,0x3D,0x40,0x06,0x38,0x19,0xB7,
0x0C,0xB0,0x0A,0x37,0x06,0x30,0x01,0xB5,0x08,0x09,0x0B,0x48,0x9D,0x02,0x00,0xCA,
0xC1,0x86,0x2D,0xF6,0x03,0x0B,0x2D,0xFE,0xDD,0x43,0x14,0x60,0xF0,0x6D,0xC0,0x46,
0x48,0x8D,0x80,0x00,0x2C,0x8F,0x80,0x00,0x48,0x93,0x80,0x00,0x41,0x93,0x80,0x00,
0xF0,0x93,0x80,0x00,0xFA,0x93,0x80,0x00,0x80,0x92,0x80,0x00,0x5C,0x91,0x80,0x00,
0x5C,0x93,0x80,0x00,0x44,0x93,0x80,0x00,0xFC,0x93,0x80,0x00,0x70,0x07,0x70,0x65,
0x00,0xA2,0x02,0xA8,0x30,0xCD,0x2B,0xA4,0x61,0x03,0xC2,0xEE,0x17,0x0B,0x52,0xF0,
0x52,0xE8,0xD6,0x1C,0x9A,0xE8,0x55,0x48,0x82,0xEE,0x52,0xF0,0x01,0xB8,0x52,0xE8,
0x2D,0xF2,0x40,0xF0,0x41,0xE8,0x35,0x03,0xD6,0x1C,0x9A,0xE8,0x54,0x48,0xCA,0x1C,
0x59,0xE8,0x4B,0x48,0x1B,0xF2,0x13,0x03,0x24,0xF2,0x1A,0xEC,0x34,0x03,0x19,0xBA,
0x12,0xEB,0x10,0xF4,0x05,0xC4,0x21,0xEC,0x14,0xB9,0x49,0xEB,0x01,0xA2,0x08,0xF4,
0x0A,0xC5,0x22,0xEC,0x19,0xBA,0xD3,0xEA,0x19,0xF4,0x04,0xC4,0x14,0xBD,0x2C,0xEB,
0x02,0xA2,0x23,0xF4,0x00,0xC5,0x00,0xA2,0x10,0xEC,0x70,0x6D,0x4C,0x8F,0x80,0x00,
0xF0,0x65,0x16,0xF6,0x36,0xFE,0x2B,0xA3,0x32,0xEC,0x5A,0x03,0x84,0x60,0x49,0x0C,
0x00,0x32,0xA5,0xE8,0xEA,0x48,0xAB,0x48,0x12,0xF2,0xAF,0x4C,0x1A,0x03,0xEB,0x4C,
0x01,0xB5,0xED,0x4F,0x01,0xBD,0x2D,0xF6,0x2D,0xFE,0x1B,0xF2,0x03,0x35,0x3B,0x03,
0x6F,0xF0,0x00,0x3D,0x7F,0xE9,0x3D,0x1D,0xE7,0xE9,0x7F,0x48,0x2E,0xEC,0x3F,0xF2,
0x3E,0x03,0x03,0x3F,0x00,0x3D,0x08,0xB7,0x7F,0xF0,0x7F,0xE9,0x3D,0x1D,0xE7,0xE9,
0x7F,0x48,0x3F,0xF2,0x2F,0x03,0x35,0xF4,0x2D,0xE4,0xAE,0xEA,0xF5,0xE7,0x76,0xE9,
0x3F,0xF4,0x6E,0x00,0x3F,0xE4,0x75,0xEC,0xFE,0xEA,0xF7,0xE7,0xF6,0xE9,0x7E,0x00,
0x01,0xB6,0x02,0x50,0x02,0x36,0x0B,0x50,0x31,0xAA,0x03,0xCC,0x01,0xA2,0xB5,0x02,
0x12,0xCC,0x54,0x80,0x2C,0x0F,0x2C,0x0E,0x7F,0x4B,0x36,0x4B,0x3F,0xF2,0x37,0x03,
0x31,0xA6,0xBC,0x06,0x76,0x02,0xB4,0x04,0x01,0x37,0x94,0x05,0x06,0xCC,0x02,0x3F,
0xBD,0x02,0x44,0xCD,0x01,0x3A,0x01,0xBA,0x02,0x50,0x3F,0x80,0x22,0x0E,0xB6,0x4B,
0xB4,0x06,0x21,0x0E,0xF7,0x4B,0x66,0x06,0x3F,0xF2,0x3E,0x03,0xB4,0x06,0x40,0xA6,
0x76,0x02,0x37,0xEC,0x67,0x04,0x9F,0x02,0x07,0xCD,0x00,0xA7,0x00,0x3C,0xBC,0x06,
0x01,0x34,0x02,0xA7,0x64,0x06,0x94,0x06,0x1C,0x80,0x02,0x3E,0xB5,0x02,0x26,0xCA,
0x01,0xA7,0x7F,0x02,0x3B,0xEC,0x02,0x50,0x63,0x04,0x1F,0x80,0x26,0xEC,0x01,0x3A,
0x09,0xB6,0x76,0xF0,0xB6,0xE8,0x0F,0x0A,0xB2,0x1C,0x00,0x32,0x0D,0x0A,0xB6,0xE8,
0x76,0x48,0x00,0x3A,0x36,0xF2,0x32,0x03,0x93,0x02,0x00,0xCD,0x13,0xEC,0x01,0xB7,
0x3F,0xF6,0x3F,0xFE,0x03,0x3E,0x01,0xB4,0xB7,0x02,0xE7,0xC3,0x62,0x06,0x4A,0xAB,
0x05,0xCC,0x02,0x3F,0xBD,0x02,0x02,0xCA,0x02,0x50,0x01,0xA3,0x0B,0x50,0x04,0x60,
0xF0,0x6D,0xC0,0x46,0x4C,0x8F,0x80,0x00,0x6C,0x90,0x80,0x00,0xF0,0x65,0x12,0xF6,
0x2B,0xA3,0x12,0xFE,0x5A,0x03,0x3A,0x0F,0x87,0x60,0x04,0x30,0x05,0x31,0xBB,0xE8,
0x01,0xB3,0xDB,0x4F,0x37,0x0C,0x00,0xA0,0x01,0x33,0x00,0xA3,0x02,0x33,0x25,0xEC,
0x03,0x30,0x00,0xA6,0x06,0x32,0x84,0x06,0x37,0x80,0x06,0x38,0x30,0x09,0x5A,0xF0,
0x12,0xE8,0x50,0x1C,0x52,0xE8,0x51,0x48,0x09,0xF2,0x01,0x03,0x18,0xEC,0x06,0x3A,
0x08,0xB0,0x2B,0x0F,0x40,0xF0,0x80,0xE8,0xC2,0x1D,0xC0,0xE9,0x40,0x48,0x00,0xF2,
0x02,0x03,0x08,0xEC,0xB1,0x02,0x00,0xC2,0x30,0xEC,0x06,0xF4,0x36,0xFC,0x08,0xEC,
0xA9,0x02,0x00,0xC9,0x28,0xEC,0x03,0x3F,0x05,0xF4,0x68,0x06,0x2D,0xFC,0x02,0x20,
0xBA,0x02,0x02,0xC2,0x0C,0xA7,0x3F,0x1A,0x07,0x20,0x6F,0x06,0x3F,0x28,0x38,0xF4,
0x00,0xFC,0x03,0x30,0x10,0xEC,0xA2,0x02,0x00,0xC9,0x20,0xEC,0x04,0xF4,0x02,0x38,
0x80,0xE8,0x02,0x30,0x24,0xFC,0x8C,0x04,0x01,0xB3,0x1A,0xF6,0x01,0x39,0x12,0xFE,
0x8A,0x02,0xC2,0xC3,0x60,0x06,0x02,0xA9,0x14,0xC9,0x0F,0xEC,0x02,0xBF,0x3F,0xF6,
0x3F,0xFE,0x80,0xEB,0x39,0xEC,0x40,0xEB,0xFD,0x97,0x20,0x9C,0x04,0x3A,0x02,0x3B,
0x03,0x39,0x10,0x50,0x58,0xEA,0x00,0xEB,0x39,0xEC,0xFD,0x97,0x17,0x9C,0x05,0x3A,
0x10,0x50,0x0A,0x80,0x01,0x39,0xFD,0x97,0x11,0x9C,0x04,0x3B,0x01,0x39,0x18,0x50,
0x02,0x38,0xFD,0x97,0x0B,0x9C,0x05,0x3F,0x38,0x50,0x07,0x60,0xF0,0x6D,0xC0,0x46,
0x4C,0x8F,0x80,0x00,0xFF,0xFF,0x00,0x00,0xF0,0x65,0xC7,0x0B,0xDB,0x4B,0x8E,0x60,
0x06,0xA2,0xC6,0x08,0x00,0xA1,0x05,0x33,0xFD,0x97,0x51,0x9D,0xC4,0x0B,0x1A,0xEC,
0x81,0xB3,0x80,0xB2,0x1B,0x48,0x12,0x48,0x1B,0xF2,0x13,0x03,0x63,0xAB,0x08,0xC8,
0xC0,0x0B,0x1B,0x58,0x7A,0xB3,0x1B,0x48,0x0F,0xA2,0x1A,0x00,0xBE,0x0B,0x2C,0xB3,
0x1A,0x40,0xBD,0x0B,0x2C,0xB3,0x1B,0x48,0x00,0xA0,0x07,0x33,0x04,0x30,0x00,0xA5,
0xCE,0x82,0x00,0xA1,0x0D,0x31,0x0C,0x31,0xA9,0xF0,0x49,0xE9,0x8B,0xF0,0xB7,0x0A,
0xC9,0xE8,0x89,0xE8,0x0C,0x4D,0x2B,0xA2,0x62,0x03,0xB5,0x0B,0xD2,0xE8,0x53,0xEC,
0xDE,0x4F,0x0B,0xEC,0x08,0xB3,0x58,0x48,0x09,0x4A,0x00,0xF2,0x08,0x03,0x02,0x30,
0x99,0x48,0xDB,0x48,0x1B,0xF2,0x0B,0x03,0x08,0x33,0x03,0xB2,0xD3,0x4F,0x00,0xAB,
0x09,0xC0,0xA5,0x0F,0xFA,0x4C,0x01,0xA3,0x22,0x01,0x13,0x02,0x03,0xC0,0xFA,0x4C,
0xA3,0x00,0x9A,0x03,0xFA,0x44,0x2B,0xA3,0x63,0x03,0xA5,0x0A,0xD3,0xE8,0xDA,0xEC,
0x00,0xA0,0xD0,0x47,0x02,0xB3,0xDB,0x4F,0x00,0xAB,0x02,0xC1,0xA1,0x0B,0x01,0xA2,
0x1A,0x15,0xA0,0x0B,0x1B,0x1D,0x00,0xAB,0x4E,0xC0,0x9C,0x09,0x07,0x3A,0x8C,0x06,
0x9B,0x0F,0xA9,0xF0,0xB2,0x02,0x25,0xC9,0x2B,0xA3,0x18,0xEC,0x60,0x03,0x72,0xF0,
0x49,0xE9,0x03,0x30,0x12,0xE8,0x88,0xF0,0x09,0xE8,0x61,0x04,0x08,0xED,0x09,0x49,
0x8C,0x06,0x41,0x48,0x63,0x06,0x09,0xF2,0x19,0x03,0xB9,0x14,0x09,0xFA,0xBA,0xE8,
0x51,0x40,0x32,0xEC,0x03,0x39,0x08,0xB2,0x52,0xF0,0x53,0xE8,0xC1,0x48,0x82,0x48,
0x09,0xF2,0x0A,0x03,0x01,0xB6,0xFA,0x14,0x36,0xF6,0x12,0xFA,0xFB,0xE8,0x5A,0x40,
0x36,0xFE,0x21,0x80,0x2B,0xA3,0x18,0xEC,0x60,0x03,0x72,0xEE,0x49,0xE9,0x52,0xF0,
0x03,0x30,0x12,0xE8,0x88,0xF0,0x09,0xE8,0x61,0x04,0x08,0xED,0x09,0x49,0x8C,0x06,
0x41,0x48,0x63,0x06,0x09,0xF2,0x19,0x03,0xB9,0x14,0x09,0xFA,0xBA,0xE8,0x51,0x40,
0x03,0x39,0xF2,0xED,0x52,0xF0,0x53,0xE8,0xC1,0x48,0x82,0x48,0x09,0xF2,0x0A,0x03,
0xFA,0x14,0x12,0xFA,0xFB,0xE8,0x5A,0x40,0x02,0xAE,0x76,0xC9,0x2B,0xA1,0x61,0x03,
0x73,0x0A,0x73,0xEE,0x88,0xE8,0x10,0xB1,0x5B,0xF0,0x89,0xE8,0xC9,0xE8,0xC0,0xE8,
0xE3,0xF0,0x71,0x0A,0x1B,0xE9,0x06,0x31,0x03,0x30,0x5B,0xF0,0xD3,0xE8,0x5A,0x29,
0x09,0x32,0x9F,0x29,0x0A,0x37,0x1B,0x2A,0x0B,0x33,0x66,0x0B,0x1B,0x58,0x8A,0xB3,
0x1B,0x28,0x00,0xA1,0x42,0x1E,0x06,0x38,0x3F,0xA7,0x1F,0x00,0x00,0xA1,0x43,0x1E,
0xA5,0xA1,0x00,0x31,0x01,0x31,0xB9,0xA0,0xB9,0xA1,0x00,0x90,0x2F,0x9B,0x00,0xA8,
0x02,0xC0,0x05,0xBF,0x3F,0xF4,0x3F,0xFC,0x60,0x0B,0x02,0x3A,0x9A,0x02,0x39,0xCC,
0x09,0x38,0x03,0xEC,0x7B,0x03,0x9B,0xF2,0x1B,0xFC,0x9A,0x02,0x12,0xCB,0x06,0xBF,
0x3F,0xF4,0x0A,0x39,0x3F,0xFC,0x0B,0xEC,0x7B,0x03,0x9B,0xF2,0x1B,0xFC,0x9A,0x02,
0x08,0xCB,0x0B,0x38,0x47,0x03,0x08,0x3A,0xBF,0xF2,0x13,0xF4,0x1B,0xE4,0x3F,0xFC,
0xBB,0x02,0x1F,0xCA,0xE3,0xF0,0x50,0x0A,0x1B,0xE9,0x5B,0xF0,0xD3,0xE8,0x03,0x39,
0xDA,0x28,0x0A,0x20,0xA8,0xF0,0x19,0x29,0x06,0x3B,0x40,0xE9,0x19,0x20,0x83,0xF0,
0xC0,0xE8,0x46,0x0B,0x18,0xE8,0x03,0xED,0x02,0x41,0x12,0xFA,0x99,0x40,0x09,0xFA,
0x5A,0x40,0xD9,0x40,0x3C,0x0B,0x01,0xA1,0xDA,0x4C,0xA1,0x00,0x0A,0x03,0x12,0xF6,
0x12,0xFE,0xDA,0x44,0x38,0x0B,0xDB,0x4C,0x23,0x01,0xDF,0xF7,0x05,0xC5,0x05,0x3B,
0x01,0xBB,0x1B,0xF6,0x1B,0xFE,0x05,0x33,0xC7,0x81,0x2B,0xA3,0x18,0xEC,0x60,0x03,
0x37,0x0A,0x13,0xE8,0x59,0xEC,0xCE,0x47,0x03,0x30,0x99,0xEC,0xC8,0x4F,0x01,0xA8,
0x6E,0xC8,0x24,0xB3,0x1A,0x49,0xD9,0x48,0x12,0xF2,0x0A,0x03,0x59,0x49,0x09,0xF4,
0x0A,0x03,0x99,0x49,0x09,0xF6,0x0A,0x03,0x02,0x39,0x8A,0x02,0x07,0xCA,0xD9,0x40,
0x02,0x38,0x02,0xFA,0x1A,0x41,0x00,0xA2,0x5A,0x41,0x02,0xFE,0x9A,0x41,0x30,0xEC,
0x21,0xEC,0xFF,0x97,0x5C,0x9D,0x00,0xA8,0x0C,0xC0,0x22,0xEC,0x0D,0x78,0x0C,0x79,
0xFF,0x97,0x8E,0x9D,0x2B,0xA3,0x63,0x03,0x21,0x0A,0xD3,0xE8,0x02,0xB3,0x02,0xA2,
0xDA,0x47,0x23,0x80,0x07,0x39,0x1E,0x0F,0xB1,0x02,0x19,0xC8,0x0C,0x79,0x22,0xEC,
0x0D,0x78,0xFF,0x97,0x1B,0x9E,0xAB,0xF0,0x5B,0xE9,0x9A,0xF0,0x9B,0xE8,0x17,0x0A,
0xD3,0xE8,0x2B,0xA2,0x62,0x03,0xBF,0xE8,0x3A,0xEC,0x24,0xB2,0xD1,0x48,0x12,0x49,
0x12,0xF2,0x11,0x03,0x19,0x42,0x09,0xFA,0x59,0x42,0x02,0xB7,0x07,0xA3,0x04,0x80,
0x2B,0xA3,0x63,0x03,0xFF,0xE8,0x02,0xB7,0x01,0xA3,0xFB,0x47,0xE3,0xF0,0x0E,0x0A,
0x1B,0xE9,0x0D,0x39,0x5B,0xF0,0x99,0x12,0xD3,0xE8,0x0C,0x3A,0x08,0xA6,0x5A,0x20,
0x6A,0x06,0xB2,0x1A,0x9A,0x20,0x4A,0x81,0x2C,0x8F,0x80,0x00,0xE0,0x93,0x80,0x00,
0xA4,0x8F,0x80,0x00,0x7C,0x93,0x80,0x00,0x6C,0x90,0x80,0x00,0x48,0x93,0x80,0x00,
0x4C,0x8F,0x80,0x00,0x90,0x8E,0x80,0x00,0x64,0x93,0x80,0x00,0xCF,0x07,0x00,0x00,
0x02,0xA8,0x45,0xC1,0xAF,0xF0,0x7F,0xE9,0xB8,0xF0,0x3F,0xE8,0xD6,0x08,0xC7,0xE9,
0x38,0xED,0x08,0x30,0x3F,0x49,0x02,0x37,0x47,0x48,0x02,0x38,0x3F,0xF2,0x38,0x03,
0x07,0xF4,0x3F,0xE4,0x02,0x37,0x48,0x48,0x9F,0x48,0x00,0xF2,0x07,0x03,0xBC,0x06,
0x02,0x3F,0xBC,0x04,0x60,0x06,0x40,0xE0,0x02,0x30,0x0D,0x30,0x08,0x3F,0xBF,0x48,
0xBC,0x06,0x08,0x3F,0xF8,0x48,0x67,0x06,0x00,0xF2,0x38,0x03,0x9F,0x4C,0xDB,0x4C,
0x00,0xF4,0x1B,0xF2,0x3B,0x03,0x00,0xE4,0x03,0x3F,0xC0,0xE8,0x73,0xEE,0x5B,0xF0,
0xFF,0xE8,0xBC,0x06,0x6B,0x06,0x08,0xA7,0xFB,0x1C,0x40,0xE0,0x67,0x06,0x0C,0x30,
0xD3,0x15,0x02,0x3B,0x1F,0xFA,0x13,0xEC,0x63,0x04,0x5F,0x40,0x03,0x3F,0x07,0xB6,
0x76,0xF0,0xF6,0xE9,0x90,0x15,0x00,0xFA,0x96,0xE9,0x70,0x40,0x03,0xA3,0x46,0x80,
0x03,0xA8,0x46,0xC1,0xAF,0xF0,0x7F,0xE9,0xB8,0xF0,0x3F,0xE8,0xB2,0x08,0xC7,0xE9,
0x38,0xED,0x08,0x30,0x3F,0x49,0x02,0x37,0x47,0x48,0x02,0x38,0x3F,0xF2,0x38,0x03,
0x07,0xF4,0x3F,0xE4,0x02,0x37,0x48,0x48,0x9F,0x48,0x00,0xF2,0x07,0x03,0xBC,0x06,
0x02,0x3F,0xBC,0x04,0x60,0x06,0x40,0xE0,0x02,0x30,0x0D,0x30,0x08,0x3F,0xBF,0x48,
0xBC,0x06,0x08,0x3F,0xF8,0x48,0x67,0x06,0x00,0xF2,0x38,0x03,0x9F,0x4C,0xDB,0x4C,
0x00,0xF4,0x1B,0xF2,0x3B,0x03,0x00,0xE4,0x03,0x3F,0xC0,0xE8,0x73,0xEE,0x5B,0xF0,
0xFF,0xE8,0xBC,0x06,0x6B,0x06,0x08,0xA7,0xFB,0x1C,0x40,0xE0,0x67,0x06,0x0C,0x30,
0xD3,0x15,0x02,0x3B,0x1F,0xFA,0x13,0xEC,0x63,0x04,0x5F,0x40,0x03,0x3F,0x07,0xB6,
0x76,0xF0,0xF6,0xE9,0x90,0x15,0x00,0xFA,0x96,0xE9,0x70,0x40,0x07,0xA3,0xCB,0x47,
0xA5,0x80,0x04,0xA8,0x02,0xC1,0x00,0xA0,0xC8,0x47,0xA0,0x80,0x07,0xA2,0xCA,0x47,
0xA9,0xF0,0x49,0xE9,0x8A,0xF0,0x89,0xE8,0x8B,0x0A,0x51,0xE8,0x0A,0xED,0x56,0x48,
0x09,0x49,0x36,0xF2,0x0E,0x03,0x36,0xF4,0x36,0xE4,0x0D,0x36,0xD7,0x48,0x91,0x48,
0x3F,0xF2,0x0F,0x03,0x85,0x0A,0x3F,0xF4,0x3F,0xE4,0x12,0x58,0x0C,0x37,0x72,0xB2,
0x12,0x28,0x91,0xF6,0x00,0xC4,0x82,0x80,0x05,0xB3,0x02,0x33,0xDB,0x4F,0x02,0xAB,
0x7D,0xC8,0xE3,0xF0,0x7E,0x0A,0x1B,0xE9,0x5B,0xF0,0x98,0x1A,0x03,0x30,0xD3,0xE8,
0x5B,0x28,0x06,0x33,0xA5,0xA3,0x32,0xEC,0x00,0x33,0x01,0x33,0xB9,0xA1,0x3B,0xEC,
0xB9,0xA0,0x00,0x90,0x9B,0x99,0x03,0xEC,0x5A,0xEE,0x93,0x01,0x5B,0x02,0x14,0xA1,
0x19,0x00,0x03,0x3B,0xF2,0xEA,0x12,0xF4,0x12,0xE4,0x09,0x31,0xD1,0xE7,0x50,0xE8,
0x06,0x3A,0xBB,0xEA,0x1B,0xF4,0x48,0x00,0x1B,0xE4,0x08,0x30,0xD8,0xE7,0x1B,0xE8,
0x08,0x3A,0x43,0x00,0x99,0xE8,0x09,0xF4,0x09,0xE4,0x50,0xA9,0x03,0xCD,0x02,0x38,
0x03,0xA3,0xC3,0x47,0x38,0x80,0x32,0xA9,0x03,0xCD,0x02,0x39,0x02,0xA3,0xCB,0x47,
0x32,0x80,0x09,0x3A,0x91,0x02,0x2F,0xCD,0x02,0x38,0xC0,0x4F,0x00,0xA2,0x84,0x06,
0x94,0x05,0x29,0xC1,0x03,0x38,0x06,0x3A,0x00,0xF4,0x00,0xE4,0x12,0xF4,0x84,0x06,
0x12,0xE4,0x66,0x04,0x94,0x06,0x02,0x3A,0x01,0xA0,0xD0,0x47,0x09,0x3A,0x67,0x04,
0x76,0xE0,0x7F,0xE0,0x00,0xAA,0x17,0xC0,0x1E,0xA9,0x00,0xCC,0x00,0xA0,0x00,0xF6,
0x00,0xA8,0x11,0xC0,0x59,0xF0,0x08,0x38,0xC9,0xE8,0x88,0x02,0x03,0xCD,0xA2,0xF0,
0x01,0xA1,0x50,0x0B,0x07,0x80,0x08,0x3A,0x51,0xF0,0x8A,0xE8,0x93,0x02,0x03,0xCD,
0x4D,0x0B,0xA2,0xF0,0x01,0xA1,0xD1,0x10,0x2B,0xA3,0x63,0x03,0x4B,0x0A,0xD3,0xE8,
0x05,0xB3,0xDB,0x4F,0x00,0xAB,0x08,0xC1,0x03,0x3E,0x06,0x3F,0x33,0xF4,0x1B,0xE4,
0x0D,0x33,0x3B,0xF4,0x1B,0xE4,0x0C,0x33,0x01,0x80,0x0D,0x36,0x0C,0x37,0x0D,0x3A,
0x00,0xAA,0x12,0xC0,0x04,0x3B,0x59,0xF0,0x41,0x08,0xC9,0xE8,0x0C,0x3E,0x49,0xF0,
0x43,0xE8,0x9E,0x40,0x36,0xFA,0xDE,0x40,0x42,0x14,0x12,0xFA,0x5A,0x40,0x1C,0x41,
0x04,0x3B,0x01,0xB3,0x1B,0xF6,0x1B,0xFE,0x04,0x33,0x01,0xB5,0x2D,0xF4,0x2D,0xFC,
0x38,0x0C,0xE3,0x4B,0x9D,0x02,0x00,0xC2,0x2B,0x85,0x05,0x3E,0x00,0xAE,0x00,0xC0,
0xA1,0x80,0x0C,0x36,0x0D,0x36,0x2C,0x0B,0x1D,0x4D,0x2B,0xA1,0x69,0x03,0x2F,0x0B,
0x58,0xE8,0x42,0xEC,0x14,0xA4,0x6F,0x06,0xD6,0x4F,0xE7,0x1D,0x2E,0x0A,0x57,0x15,
0x84,0xEC,0xE2,0x4F,0x01,0xAA,0x08,0xC1,0x02,0xAE,0x6D,0xC9,0x0D,0x78,0x0C,0x79,
0x2A,0xEC,0xFF,0x97,0x6B,0x9C,0x07,0xA3,0x14,0x80,0x02,0xAA,0x14,0xC1,0x76,0xF8,
0x72,0xF0,0x52,0xE8,0xD0,0x1C,0x9A,0xE8,0x52,0x48,0x12,0xF2,0x02,0x03,0x08,0xB6,
0x0D,0x32,0x76,0xF0,0x71,0xE8,0xCA,0x1C,0x59,0xE8,0x4B,0x48,0x1B,0xF2,0x13,0x03,
0x0C,0x33,0x03,0xA3,0xE3,0x47,0x58,0x80,0x03,0xAA,0x13,0xC1,0x72,0xEE,0x52,0xF0,
0x52,0xE8,0xD0,0x1C,0x9A,0xE8,0x52,0x48,0x12,0xF2,0x02,0x03,0x07,0xB6,0x0D,0x32,
0x76,0xF0,0x71,0xE8,0xCA,0x1C,0x59,0xE8,0x4B,0x48,0x1B,0xF2,0x13,0x03,0x0C,0x33,
0x04,0xA3,0xE7,0x87,0x07,0xAA,0x21,0xC1,0xEB,0xF0,0x09,0x0A,0x5B,0xE9,0x5B,0xF0,
0xD3,0xE8,0x06,0xA1,0x5A,0x1E,0x0D,0x32,0x08,0xA2,0x9B,0x1E,0x0C,0x33,0x05,0xA3,
0xE3,0x47,0x03,0xB0,0x24,0x80,0xC0,0x46,0x48,0x93,0x80,0x00,0x7C,0x93,0x80,0x00,
0x64,0x93,0x80,0x00,0xFC,0x8E,0x80,0x00,0xD0,0x8E,0x80,0x00,0x4C,0x8F,0x80,0x00,
0xE0,0x93,0x80,0x00,0x2C,0x8F,0x80,0x00,0x90,0x8E,0x80,0x00,0x05,0xAA,0x18,0xC1,
0x03,0xB0,0xC3,0x4F,0x01,0xAB,0x0F,0xC8,0xEB,0xF0,0x40,0x09,0x5B,0xE9,0x5B,0xF0,
0xCB,0xE8,0x06,0xA6,0x99,0x1F,0x0D,0x31,0x08,0xA7,0xDB,0x1F,0xE2,0x47,0x0C,0x33,
0xC3,0x4F,0x01,0xB3,0xC3,0x47,0x08,0x80,0x68,0x06,0x14,0xA1,0x08,0x1C,0xE0,0x47,
0x03,0x80,0x69,0x06,0x14,0xA2,0x51,0x1C,0xE1,0x47,0x0C,0x3A,0x00,0xAA,0x12,0xC0,
0x04,0x3B,0x59,0xF0,0x32,0x08,0xC9,0xE8,0x49,0xF0,0x43,0xE8,0x9A,0x40,0x12,0xFA,
0xDA,0x40,0x0D,0x3A,0x42,0x14,0x12,0xFA,0x5A,0x40,0x1D,0x41,0x04,0x3B,0x01,0xB3,
0x1B,0xF6,0x1B,0xFE,0x04,0x33,0x6C,0x06,0x10,0xA6,0x2A,0x0B,0x34,0x1D,0x2A,0x0A,
0xDC,0x43,0x27,0x0B,0x19,0x49,0x93,0xEC,0xDB,0x4F,0x00,0xAB,0x17,0xC1,0x50,0xEC,
0xC3,0x47,0x10,0xED,0xC3,0x47,0x50,0xED,0xC3,0x47,0xD0,0xED,0xC3,0x47,0x90,0xED,
0xC3,0x47,0x02,0xB0,0xC3,0x47,0x20,0xB0,0x03,0x40,0x2A,0xB2,0x01,0xB0,0x03,0x40,
0x13,0x40,0x1E,0x0B,0x01,0xA0,0x5A,0x1C,0x88,0x00,0x82,0x03,0x5A,0x14,0x18,0x0B,
0x5D,0x48,0x1C,0x48,0x2D,0xF2,0x15,0x0A,0xC8,0xF0,0x2C,0x03,0x09,0xC0,0x40,0xE8,
0x40,0xF0,0x12,0xE8,0xD4,0x20,0x98,0x48,0xDB,0x48,0x1B,0xF2,0x03,0x03,0x13,0x21,
0x07,0x80,0x43,0xE8,0x5B,0xF0,0xD3,0xE8,0x11,0x0A,0x90,0x28,0xD8,0x20,0xD2,0x28,
0x1A,0x21,0xCB,0xF0,0x59,0xE8,0x09,0x0B,0x49,0xF0,0x59,0xE8,0x08,0xEC,0x08,0xB0,
0x42,0x28,0x8A,0x21,0x0A,0x0A,0x14,0x29,0x0B,0xEC,0x44,0x20,0x0C,0xB3,0x58,0x28,
0x08,0x22,0x52,0x29,0x0E,0x60,0x5A,0x20,0xF0,0x6D,0xC0,0x46,0x64,0x93,0x80,0x00,
0xE0,0x93,0x80,0x00,0x2C,0x8F,0x80,0x00,0x4C,0x8F,0x80,0x00,0x78,0x93,0x80,0x00,
0x48,0x93,0x80,0x00,0x04,0x0B,0x42,0xF0,0x10,0xE8,0x19,0x58,0xC0,0xF0,0x1A,0x58,
0x52,0xEA,0x82,0x02,0xFB,0xC3,0x70,0x07,0x34,0x06,0x80,0x00,0x30,0x65,0x03,0x3D,
0x80,0xEA,0xC9,0xEA,0x02,0xEC,0x0B,0xEC,0x50,0x03,0x59,0x03,0x2A,0xEC,0x55,0x03,
0x09,0xE8,0x04,0x3C,0x01,0xA0,0xA9,0x02,0x05,0xCC,0x23,0xEC,0x5C,0x03,0x00,0xA0,
0xA1,0x02,0x00,0xCD,0x02,0xA0,0x30,0x6D,0x13,0xF4,0x02,0x28,0x12,0xF4,0x09,0xF4,
0x1B,0xE4,0x12,0xE4,0x09,0xE4,0x9A,0x02,0x02,0xCB,0xCB,0xEA,0x9A,0x02,0x00,0xCB,
0x03,0x20,0x70,0x07,0x00,0xA3,0x01,0x80,0xC1,0x14,0x01,0xB3,0x93,0x02,0xFB,0xC3,
0x70,0x07,0x30,0x65,0x52,0xE0,0x00,0xA3,0x00,0xA4,0x03,0x80,0xCD,0x1A,0x01,0xB4,
0xC5,0x12,0x02,0xB3,0x94,0x02,0xF9,0xCB,0x30,0x6D,0x10,0x65,0x00,0xA3,0x02,0x80,
0xCC,0x1C,0xC4,0x14,0x01,0xB3,0x93,0x02,0xFA,0xC3,0x10,0x6D,0x10,0x65,0x09,0xF4,
0x02,0xEC,0x49,0xFC,0x00,0xA3,0x00,0xA0,0x07,0x80,0x14,0x28,0x01,0xB3,0x00,0xE9,
0x00,0xF4,0x1B,0xF4,0x00,0xFC,0x1B,0xFC,0x02,0xB2,0x8B,0x02,0xF5,0xC3,0x10,0x6D,
0x10,0x65,0x09,0xF4,0x02,0xEC,0x09,0xFC,0x00,0xA0,0x00,0xA3,0x07,0x80,0x14,0x48,
0x01,0xB3,0x00,0xE9,0x00,0xF6,0x1B,0xF4,0x00,0xFE,0x1B,0xFC,0x01,0xB2,0x8B,0x02,
0xF5,0xC3,0x10,0x6D,0x70,0x07,0x00,0x00,0x00,0x65,0x07,0x0A,0x07,0x0B,0x08,0x08,
0x1A,0x50,0x08,0x0B,0x18,0x50,0x08,0x0B,0x01,0xA2,0x1A,0x40,0xFF,0xA1,0x0A,0xA2,
0xFF,0x97,0xB0,0x9F,0x00,0x6D,0xC0,0x46,0x80,0x9F,0x80,0x00,0x28,0x8F,0x80,0x00,
0x00,0x9F,0x80,0x00,0x24,0x8F,0x80,0x00,0xF8,0x9F,0x80,0x00,0xF0,0x65,0x52,0x0B,
0x52,0x0D,0x00,0xA2,0x85,0x60,0x1A,0x44,0x6A,0x41,0x2C,0x80,0x56,0xF0,0xB6,0xE8,
0x4F,0x09,0x76,0xF0,0x88,0xE9,0x04,0x49,0xA9,0xE9,0x0C,0x41,0x61,0xF0,0x09,0xE9,
0x49,0xF0,0x8C,0x06,0x29,0xEC,0x61,0x04,0x01,0xA7,0x4F,0x41,0x1F,0x4C,0x00,0x37,
0x01,0xA7,0xA7,0x00,0x3C,0xEC,0x00,0x3F,0x3C,0x03,0x24,0xF6,0x24,0xFE,0x1C,0x44,
0x43,0x0C,0xA6,0x1D,0x44,0x48,0x24,0xF2,0x34,0x03,0x66,0x06,0xAC,0x15,0x24,0xFA,
0x4C,0x40,0x84,0x48,0xC0,0x48,0x00,0xF2,0x20,0x03,0x88,0x40,0x01,0xB2,0x00,0xFA,
0x12,0xF6,0xC8,0x40,0x12,0xFE,0xD9,0x4B,0x8A,0x02,0xCF,0xC3,0xD9,0x4C,0x1A,0x4C,
0x0A,0x00,0xDA,0x44,0xDA,0x4B,0x00,0xAA,0x01,0xC0,0x02,0xA2,0xDA,0x40,0x32,0x0D,
0xEB,0x48,0x00,0xAB,0x5B,0xC0,0x01,0x7C,0x20,0xEC,0xFF,0xA1,0x08,0xA2,0xFD,0x97,
0x86,0x98,0x2B,0x4C,0x6A,0x4C,0xEE,0x4B,0x5A,0x00,0x26,0x40,0x2B,0x0B,0x94,0x06,
0x1A,0x49,0x57,0xF0,0xBF,0xE8,0x7F,0xF0,0xF9,0x1C,0xDF,0xE9,0x78,0x48,0xBB,0x48,
0xFF,0x48,0x00,0xF2,0x3F,0xF2,0x08,0x03,0x3B,0x03,0xED,0x4B,0x00,0xF4,0x1B,0xF4,
0x67,0x06,0x01,0xE4,0x1B,0xE4,0x17,0x01,0x00,0xAD,0x0F,0xC1,0x01,0xA5,0x3D,0x02,
0x2C,0xC0,0x10,0xA7,0xBC,0x06,0x67,0x06,0x3E,0x03,0x92,0xF0,0x16,0x03,0x26,0x40,
0x61,0x40,0xA3,0x40,0x00,0xE6,0xFF,0xA9,0x1A,0xCC,0x0D,0x80,0x01,0xA5,0x3D,0x00,
0x6F,0x02,0x6F,0x01,0x92,0xF0,0x00,0x37,0x16,0x03,0x7F,0xF1,0x3E,0x03,0x26,0x40,
0x61,0x40,0xA3,0x40,0xFF,0xA9,0x09,0xCC,0xFF,0xAB,0x0F,0xCD,0x01,0xA2,0x1B,0xE2,
0x13,0x03,0x22,0x48,0xDB,0xF1,0x13,0x03,0x23,0x40,0x07,0x80,0x00,0xE6,0x01,0xA5,
0x22,0x48,0x05,0x03,0xAD,0xF1,0x15,0x03,0x25,0x40,0xED,0x87,0x09,0x0B,0x1B,0x48,
0x01,0xAB,0x04,0xC0,0x08,0x08,0x01,0x79,0x02,0xA2,0xFD,0x97,0x38,0x98,0x02,0x0B,
0x1A,0x4C,0x05,0x60,0x5A,0x44,0xF0,0x6D,0x2C,0x8F,0x80,0x00,0xE8,0x93,0x80,0x00,
0xE0,0x93,0x80,0x00,0x03,0x00,0x80,0x00,0x80,0x9F,0x80,0x00,0x00,0x65,0xFE,0x97,
0x59,0x9A,0x0F,0x0B,0x1B,0x58,0x9B,0x49,0x35,0xAB,0x01,0xC1,0xFD,0x97,0x08,0x9C,
0x0C,0x0B,0x1A,0x48,0xA5,0xAA,0x12,0xC1,0x5A,0x48,0x03,0xAA,0x03,0xC1,0x0A,0x0A,
0x02,0xA1,0x51,0x46,0x08,0x80,0x5A,0xAA,0x09,0xC1,0x07,0x0A,0x01,0xA1,0xD1,0x46,
0x06,0x0A,0x11,0x58,0x06,0x0A,0x11,0x50,0x00,0xA2,0x1A,0x40,0x5A,0x40,0x00,0x6D,
0x24,0x8F,0x80,0x00,0x00,0x9F,0x80,0x00,0x2C,0x8F,0x80,0x00,0x34,0x06,0x80,0x00,
0x68,0x90,0x80,0x00,0xF0,0x65,0x39,0x0B,0x5B,0x4A,0x00,0xAB,0x03,0xC1,0x38,0x0B,
0x1B,0x48,0x00,0xAB,0x68,0xC0,0x37,0x0A,0x37,0x0B,0x12,0x28,0x7F,0xA0,0x10,0x00,
0x1B,0x28,0x36,0x0A,0x93,0x02,0x16,0xC9,0x30,0x0A,0x51,0x4A,0x00,0xA9,0x08,0xC1,
0x3D,0xA8,0x06,0xC1,0x32,0x0C,0x01,0xA1,0x51,0x42,0xA3,0x02,0x01,0xC1,0x51,0x41,
0x0F,0x80,0x30,0x0A,0x93,0x02,0x0C,0xC1,0x28,0x09,0x00,0xA2,0x4A,0x42,0x4A,0x41,
0x29,0x09,0x0A,0x20,0x05,0x80,0x80,0xA2,0x12,0xF4,0x9D,0xE8,0x2A,0x0A,0x93,0x02,
0x04,0xC9,0x03,0xA2,0x13,0x00,0x29,0x0A,0x9B,0xF0,0x9D,0x18,0x28,0x0B,0x28,0xB3,
0x1B,0x48,0x98,0x02,0x02,0xC9,0x27,0x0A,0x95,0x02,0x00,0xC1,0x03,0xEC,0x23,0x0A,
0x00,0xA1,0x14,0x59,0x00,0xA2,0x07,0x80,0x2E,0x28,0x89,0xE9,0x09,0xF4,0x26,0x20,
0x09,0xFC,0x01,0xB2,0x02,0xB5,0x02,0xB4,0x9A,0x02,0xF5,0xC3,0x1B,0x0A,0x14,0x59,
0x5A,0xF0,0xA4,0xE8,0x25,0xEC,0x1A,0xEC,0x1B,0x0E,0x0B,0x80,0x1D,0xAA,0x02,0xC8,
0x7F,0xF0,0xBF,0x1B,0x2F,0x20,0x27,0x28,0x79,0xE8,0x09,0xF4,0x09,0xFC,0x01,0xB2,
0x02,0xB4,0x02,0xB5,0xD7,0xEA,0x82,0x02,0xF0,0xC3,0x10,0x0B,0x1B,0x59,0x52,0xF0,
0x9A,0xE8,0x11,0x20,0x05,0x0B,0x5B,0x4A,0x01,0xAB,0x02,0xC1,0x0F,0x0B,0x08,0xA2,
0x1A,0x40,0x03,0x0B,0x00,0xA2,0x1A,0x20,0xF0,0x6D,0xC0,0x46,0x2C,0x8F,0x80,0x00,
0x24,0x9F,0x80,0x00,0x20,0x9F,0x80,0x00,0x22,0x9F,0x80,0x00,0xFF,0xFE,0x00,0x00,
0xF1,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xEF,0x00,0x00,0x64,0x8D,0x80,0x00,
0x6C,0x90,0x80,0x00,0xD8,0x9E,0x80,0x00,0xB8,0x93,0x80,0x00,0x83,0x00,0x80,0x00,
0xF0,0x65,0x19,0x0C,0x81,0x60,0x22,0xEC,0x18,0x09,0x00,0xA3,0x18,0x08,0x16,0x80,
0x5D,0xF0,0xED,0xE8,0x17,0x0E,0x6D,0xF0,0xAE,0x1D,0x16,0x0F,0x00,0x36,0xED,0xE9,
0x6E,0x48,0x00,0x3F,0x36,0xF2,0x37,0x03,0x97,0x20,0xAF,0x48,0xED,0x48,0x2D,0xF2,
0x3D,0x03,0xD5,0x20,0x0D,0x48,0x01,0xB3,0x55,0x42,0x06,0xB1,0x06,0xB2,0xC5,0x4B,
0xAB,0x02,0xE5,0xCB,0xC3,0x4B,0x23,0x40,0x63,0x48,0x01,0xB3,0x63,0x40,0x90,0xA7,
0x03,0x4C,0xBF,0xF1,0xDB,0xE9,0x63,0x20,0x20,0xEC,0x1C,0xA1,0xFF,0x97,0x26,0x9E,
0x01,0x60,0x40,0x02,0xA0,0x23,0xF0,0x6D,0xD8,0x9E,0x80,0x00,0xE4,0x93,0x80,0x00,
0x2C,0x8F,0x80,0x00,0xE0,0x93,0x80,0x00,0xF0,0x65,0x2C,0x0B,0x2C,0x08,0x5B,0x59,
0x00,0xA2,0x1A,0x20,0x82,0x60,0x9A,0x20,0x2A,0x09,0x04,0xEC,0x2C,0x80,0x0D,0x48,
0x01,0x35,0x55,0xF0,0xAD,0xE8,0x28,0x0E,0x6D,0xF0,0xAE,0x1D,0x26,0x0F,0x00,0x36,
0xED,0xE9,0x6E,0x48,0x00,0x3F,0x36,0xF2,0x37,0x03,0x00,0x37,0xAE,0x48,0xED,0x48,
0x6F,0x06,0x3F,0x28,0x2D,0xF2,0x35,0x03,0x1F,0x20,0x5D,0x20,0x01,0x3D,0x01,0xAD,
0x05,0xC1,0x1D,0x28,0x1D,0x0E,0x35,0x03,0x2D,0xF4,0x2D,0xFC,0x1D,0x20,0x25,0x4C,
0x67,0x4C,0x7D,0x00,0x03,0xAD,0x04,0xC1,0xE5,0x4B,0x01,0xAD,0x01,0xC1,0x00,0xA5,
0x1D,0x20,0x01,0xB2,0x04,0xB3,0x06,0xB1,0xC5,0x4B,0xAA,0x02,0xCF,0xCB,0x14,0x0B,
0x1A,0x48,0x01,0xB2,0x12,0xF6,0x12,0xFE,0x1A,0x40,0x43,0x49,0x00,0xAB,0x0A,0xC0,
0x10,0x0B,0x9B,0x49,0xC0,0xAB,0x06,0xC1,0x08,0x0B,0x59,0x59,0x80,0xA3,0x08,0x28,
0xDB,0xF1,0x03,0x03,0x0B,0x20,0x05,0x0B,0x05,0x09,0x5B,0x59,0xC9,0x4B,0x19,0x21,
0x19,0x29,0x12,0xF2,0x0A,0x03,0x02,0x60,0x1A,0x21,0xF0,0x6D,0x64,0x8D,0x80,0x00,
0x2C,0x8F,0x80,0x00,0xE4,0x93,0x80,0x00,0xE0,0x93,0x80,0x00,0x00,0x80,0xFF,0xFF,
0x94,0x8E,0x80,0x00,0x88,0x93,0x80,0x00,0x00,0x00,0x00,0x10,0xA0,0x16,0xB6,0x1B,
0x00,0x20,0xC6,0x23,0x31,0x27,0x54,0x2A,0x41,0x2D,0x00,0x30,0x98,0x32,0x10,0x35,
0x6C,0x37,0xB0,0x39,0xDD,0x3B,0xF7,0x3D,0x00,0x40,0xF8,0x41,0xE1,0x43,0xBE,0x45,
0x8D,0x47,0x52,0x49,0x0B,0x4B,0xBB,0x4C,0x62,0x4E,0x00,0x50,0x95,0x51,0x23,0x53,
0xA9,0x54,0x29,0x56,0xA2,0x57,0x15,0x59,0x82,0x5A,0x00,0x00,0x50,0x02,0xA0,0x04,
0xF0,0x06,0x40,0x09,0x90,0x0B,0xE0,0x0D,0x50,0x02,0xA0,0x04,0xF0,0x06,0x40,0x09,
0x90,0x0B,0xE0,0x0D,0x00,0x9F,0x80,0x00,0xFC,0x90,0x80,0x00,0xBC,0x91,0x80,0x00,
0xD8,0x9E,0x80,0x00,0x9C,0x90,0x80,0x00,0x26,0x9F,0x80,0x00,0x96,0x9F,0x80,0x00,
0x02,0x9E,0xD8,0x2D,
};
#endif

View File

@ -0,0 +1,186 @@
#include <stdbool.h>
#include <stdint.h>
#include "chsc6x_comp.h"
#include "chsc6x_platform.h"
struct ts_event {
unsigned short x; /*x coordinate */
unsigned short y; /*y coordinate */
int flag; /* touch event flag: 0 -- down; 1-- up; 2 -- contact */
int id; /*touch ID */
};
bool chsc6x_read_touch_info(uint16_t *x, uint16_t *y)
{
int ret;
int rd_len = 0;
unsigned char point_num;
unsigned char read_buf[6];
struct ts_event events[CHSC6X_MAX_POINTS_NUM];
if(1 == CHSC6X_MAX_POINTS_NUM) {
rd_len = 3;
} else if(2 == CHSC6X_MAX_POINTS_NUM) {
if ((CHSC6X_RES_MAX_X < 255) && (CHSC6X_RES_MAX_Y < 255) ) {
rd_len = 5;
} else {
rd_len = 6;
}
} else {
chsc6x_err("CHSC641X_MAX_POINTS_NUM more than two");
return false;
}
ret = chsc6x_i2c_read(CHSC6X_I2C_ID, read_buf, rd_len);
if(rd_len == ret) {
point_num = read_buf[0] & 0x03;
if(1 == CHSC6X_MAX_POINTS_NUM) {
events[0].x = (unsigned short)(((read_buf[0] & 0x40) >> 6) << 8) | (unsigned short)read_buf[1];
events[0].y = (unsigned short)(((read_buf[0] & 0x80) >> 7) << 8) | (unsigned short)read_buf[2];
events[0].flag= (read_buf[0] >> 4) & 0x03;
events[0].id = (read_buf[0] >>2) & 0x01;
chsc6x_info("chsc6x: 000 X:%d, Y:%d, point_num:%d,flag:%d, id:%d \r\n", \
events[0].x, events[0].y, point_num, events[0].flag, events[0].id);
} else if(2 == CHSC6X_MAX_POINTS_NUM) {
if ((CHSC6X_RES_MAX_X > 255) || (CHSC6X_RES_MAX_Y > 255) ) {
events[0].x = (unsigned short)((read_buf[5] & 0x01) << 8) | (unsigned short)read_buf[1];
events[0].y = (unsigned short)((read_buf[5] & 0x02) << 7) | (unsigned short)read_buf[2];
events[0].flag = (read_buf[0] >> 4) & 0x03;
events[0].id = (read_buf[0] >>2) & 0x01;
chsc6x_info("chsc6x: 111 X:%d, Y:%d, point_num:%d,flag:%d, id:%d \r\n", \
events[0].x, events[0].y, point_num, events[0].flag, events[0].id);
events[1].x = (unsigned short)((read_buf[5] & 0x04) << 6) | (unsigned short)read_buf[3];
events[1].y = (unsigned short)((read_buf[5] & 0x08) << 5) | (unsigned short)read_buf[4];
events[1].flag = (read_buf[0] >> 6) & 0x03;
events[1].id = (read_buf[0] >>3) & 0x01;
chsc6x_info("chsc6x: 222 X:%d, Y:%d, point_num:%d,flag:%d, id:%d \r\n", \
events[1].x, events[1].y, point_num, events[1].flag, events[1].id);
} else {
events[0].x = read_buf[1];
events[0].y = read_buf[2];
events[0].flag = (read_buf[0] >> 4) & 0x03;
events[0].id = (read_buf[0] >>2) & 0x01;
chsc6x_info("chsc6x: 333 X:%d, Y:%d, point_num:%d,flag:%d, id:%d \r\n", \
events[0].x, events[0].y, point_num, events[0].flag, events[0].id);
events[1].x = read_buf[3];
events[1].y = read_buf[4];
events[1].flag = (read_buf[0] >> 6) & 0x03;
events[1].id = (read_buf[0] >>3) & 0x01;
chsc6x_info("chsc6x: 444 X:%d, Y:%d, point_num:%d,flag:%d, id:%d \r\n", \
events[1].x, events[1].y, point_num, events[1].flag, events[1].id);
}
}
static uint16_t last_x = 0xffff, last_y = 0xffff;
static uint8_t same_counter = 0;
*x = events[0].x;
*y = events[0].y;
if ((last_x == events[0].x) && (last_y == events[0].y)) {
if (same_counter < 10) {
same_counter++;
}
}
else {
last_x = events[0].x;
last_y = events[0].y;
same_counter = 0;
}
if ((point_num != 0)
&& ((events[0].flag == 0) || (events[0].flag == 2))
&& (same_counter < 10)) {
return true;
}
else {
return false;
}
}
else{
chsc6x_err("chsc6x: chsc6x_read_touch_info iic err! rd_len=%d, ret=%d \r\n", rd_len, ret);
return false;
}
}
void chsc6x_resume(void)
{
chsc6x_info("touch_resume");
chsc6x_tp_reset();
}
void chsc6x_suspend(void)
{
unsigned char buft[1] = {0};
int ret = -1;
chsc6x_tp_reset();
ret = chsc6x_write_bytes_u16addr_sub(CHSC6X_I2C_ID, 0xa503, buft, 0);
if(ret == 0) {
chsc6x_info("touch_suspend OK \r\n");
}else{
chsc6x_info("touch_suspend failed \r\n");
}
}
void chsc6x_dbcheck(void)
{
unsigned char buft[1] = {0};
int ret = -1;
chsc6x_tp_reset();
ret = chsc6x_write_bytes_u16addr_sub(CHSC6X_I2C_ID, 0xd001, buft, 0); //0xd001 close
if(ret == 0) {
chsc6x_info("Enable dbcheck OK \r\n");
}else{
chsc6x_info("Enable dbcheck failed \r\n");
}
}
void chsc6x_palmcheck(void)
{
unsigned char buft[1] = {0};
int ret = -1;
chsc6x_tp_reset();
ret = chsc6x_write_bytes_u16addr_sub(CHSC6X_I2C_ID, 0xd101, buft, 0); //0xd100 close
if(ret == 0) {
chsc6x_info("Enable palmcheck OK \r\n");
}else{
chsc6x_info("Enable palmcheck failed \r\n");
}
}
void chsc6x_init(void)
{
int i = 0;
int ret = 0;
unsigned char fw_update_ret_flag = 0; //1:update OK, !0 fail
struct ts_fw_infos fw_infos;
chsc6x_tp_reset_active();
for(i = 0; i < 3; i++) {
ret = chsc6x_tp_dect(&fw_infos, &fw_update_ret_flag);
if(1 == ret) {
#if CHSC6X_AUTO_UPGRADE /* If need update FW */
chsc6x_info("chsc6x_tp_dect succeed!\r\n");
if(1 == fw_update_ret_flag) {
chsc6x_err("update fw succeed! \r\n");
break;
} else {
chsc6x_err("update fw failed! \r\n");
}
#else
break;
#endif
}else {
chsc6x_err("chsc6x_tp_dect failed! i = %d \r\n", i);
}
}
}

View File

@ -0,0 +1,339 @@
#include "chsc6x_platform.h"
#include "fr30xx.h"
void touchpad_reset_set(void);
void touchpad_reset_clear(void);
void touchpad_delay_ms(uint32_t counter);
extern I2C_HandleTypeDef i2c_touchpad_handle;
/************************************************************************************
* @fn i2c_memory_read
*
* @brief i2c memory read.
*/
bool i2c_memory_chsc6x_read_only(I2C_HandleTypeDef *hi2c, uint16_t fu16_DevAddress, uint8_t *fp_Data, uint32_t fu32_Size)
{
uint32_t lu32_RxCount = fu32_Size;
if (fu32_Size == 0)
goto _exit_i2c_read;
__I2C_DISABLE(hi2c->I2Cx);
hi2c->I2Cx->TAR.TAR = fu16_DevAddress >> 1;
__I2C_ENABLE(hi2c->I2Cx);
hi2c->I2Cx->DATA_CMD = (0 >> 8) & 0xFF;
hi2c->I2Cx->DATA_CMD = 0 & 0xFF;
while (!__I2C_IS_TxFIFO_EMPTY(hi2c->I2Cx));
/* DevAddress NACK */
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
{
i2c_clear_int_status(hi2c, INT_TX_ABRT);
__I2C_DISABLE(hi2c->I2Cx);
goto _exit_i2c_read;
}
if (fu32_Size > 1)
{
hi2c->I2Cx->DATA_CMD = CMD_RESTART | CMD_READ;
while (fu32_Size - 2)
{
if (!__I2C_IS_TxFIFO_FULL(hi2c->I2Cx))
{
hi2c->I2Cx->DATA_CMD = CMD_READ;
fu32_Size--;
}
while (!__I2C_IS_RxFIFO_EMPTY(hi2c->I2Cx))
{
*fp_Data++ = hi2c->I2Cx->DATA_CMD & 0xFF;
lu32_RxCount--;
}
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
{
i2c_clear_int_status(hi2c, INT_TX_ABRT);
__I2C_DISABLE(hi2c->I2Cx);
goto _exit_i2c_read;
}
}
/* Last byte with stop */
while (__I2C_IS_TxFIFO_FULL(hi2c->I2Cx));
hi2c->I2Cx->DATA_CMD = CMD_READ | CMD_STOP;
}
else
{
hi2c->I2Cx->DATA_CMD = CMD_RESTART | CMD_READ | CMD_STOP;
}
uint8_t to_counter = 100;
while (lu32_RxCount)
{
if (!__I2C_IS_RxFIFO_EMPTY(hi2c->I2Cx))
{
*fp_Data++ = hi2c->I2Cx->DATA_CMD & 0xFF;
lu32_RxCount--;
}
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
{
i2c_clear_int_status(hi2c, INT_TX_ABRT);
__I2C_DISABLE(hi2c->I2Cx);
goto _exit_i2c_read;
}
system_delay_us(10);
to_counter--;
if (to_counter == 0) {
break;
}
}
while(__I2C_IS_BUSY(hi2c->I2Cx));
if (lu32_RxCount == 0) {
return true;
}
else {
return false;
}
_exit_i2c_read:
__NOP();
return false;
}
/************************************************************************************
* @fn i2c_memory_read
*
* @brief i2c memory read.
*/
bool i2c_memory_chsc6x_read(I2C_HandleTypeDef *hi2c, uint16_t fu16_DevAddress, uint16_t fu16_MemAddress, uint8_t *fp_Data, uint32_t fu32_Size)
{
uint32_t lu32_RxCount = fu32_Size;
if (fu32_Size == 0)
goto _exit_i2c_read;
__I2C_DISABLE(hi2c->I2Cx);
hi2c->I2Cx->TAR.TAR = fu16_DevAddress >> 1;
__I2C_ENABLE(hi2c->I2Cx);
hi2c->I2Cx->DATA_CMD = (fu16_MemAddress >> 8) & 0xFF;
hi2c->I2Cx->DATA_CMD = fu16_MemAddress & 0xFF;
while (!__I2C_IS_TxFIFO_EMPTY(hi2c->I2Cx));
/* DevAddress NACK */
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
{
i2c_clear_int_status(hi2c, INT_TX_ABRT);
__I2C_DISABLE(hi2c->I2Cx);
goto _exit_i2c_read;
}
if (fu32_Size > 1)
{
hi2c->I2Cx->DATA_CMD = CMD_RESTART | CMD_READ;
while (fu32_Size - 2)
{
if (!__I2C_IS_TxFIFO_FULL(hi2c->I2Cx))
{
hi2c->I2Cx->DATA_CMD = CMD_READ;
fu32_Size--;
}
while (!__I2C_IS_RxFIFO_EMPTY(hi2c->I2Cx))
{
*fp_Data++ = hi2c->I2Cx->DATA_CMD & 0xFF;
lu32_RxCount--;
}
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
{
i2c_clear_int_status(hi2c, INT_TX_ABRT);
__I2C_DISABLE(hi2c->I2Cx);
goto _exit_i2c_read;
}
}
/* Last byte with stop */
while (__I2C_IS_TxFIFO_FULL(hi2c->I2Cx));
hi2c->I2Cx->DATA_CMD = CMD_READ | CMD_STOP;
}
else
{
hi2c->I2Cx->DATA_CMD = CMD_RESTART | CMD_READ | CMD_STOP;
}
while (lu32_RxCount)
{
if (!__I2C_IS_RxFIFO_EMPTY(hi2c->I2Cx))
{
*fp_Data++ = hi2c->I2Cx->DATA_CMD & 0xFF;
lu32_RxCount--;
}
}
while(__I2C_IS_BUSY(hi2c->I2Cx));
return true;
_exit_i2c_read:
__NOP();
return false;
}
/************************************************************************************
* @fn i2c_memory_write
*
* @brief i2c memory write.
*/
bool i2c_memory_chsc6x_write(I2C_HandleTypeDef *hi2c, uint16_t fu16_DevAddress, uint16_t fu16_MemAddress, uint8_t *fp_Data, uint32_t fu32_Size)
{
__I2C_DISABLE(hi2c->I2Cx);
hi2c->I2Cx->TAR.TAR = fu16_DevAddress >> 1;
__I2C_ENABLE(hi2c->I2Cx);
hi2c->I2Cx->DATA_CMD = (fu16_MemAddress >> 8) & 0xFF;
hi2c->I2Cx->DATA_CMD = fu16_MemAddress & 0xFF;
while (!__I2C_IS_TxFIFO_EMPTY(hi2c->I2Cx));
/* DevAddress NACK */
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
{
i2c_clear_int_status(hi2c, INT_TX_ABRT);
__I2C_DISABLE(hi2c->I2Cx);
goto _exit_i2c_write;
}
while (fu32_Size - 1 > 0)
{
if (!__I2C_IS_TxFIFO_FULL(hi2c->I2Cx))
{
hi2c->I2Cx->DATA_CMD = *fp_Data++;
fu32_Size--;
}
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
{
i2c_clear_int_status(hi2c, INT_TX_ABRT);
__I2C_DISABLE(hi2c->I2Cx);
goto _exit_i2c_write;
}
}
/* Last byte with stop */
while (__I2C_IS_TxFIFO_FULL(hi2c->I2Cx));
hi2c->I2Cx->DATA_CMD = *fp_Data | CMD_STOP;
while(__I2C_IS_BUSY(hi2c->I2Cx));
//while(i2c_memory_is_busy(hi2c, fu16_DevAddress));
return true;
_exit_i2c_write:
__NOP();
return false;
}
/* return: =read lenth succeed; <0 failed
read reg addr not need
just used for reading xy cord info*/
int chsc6x_i2c_read(unsigned char id, unsigned char *p_data, unsigned short lenth)
{
bool ret = i2c_memory_chsc6x_read_only(&i2c_touchpad_handle, id, p_data, lenth);
// bool ret = i2c_memory_chsc6x_read(&i2c_touchpad_handle, id, 0, p_data, lenth);
if (ret) {
return lenth;
}else{
return -1;
}
// return i2cRead(id, lenth, p_data);
}
/* RETURN:0->pass else->fail */
int chsc6x_read_bytes_u16addr_sub(unsigned char id, unsigned short adr, unsigned char *rxbuf, unsigned short lenth)
{
bool ret = i2c_memory_chsc6x_read(&i2c_touchpad_handle, id, adr, rxbuf, lenth);
if (ret) {
return 0;
}else{
return -1;
}
}
/* RETURN:0->pass else->fail */
int chsc6x_write_bytes_u16addr_sub(unsigned char id, unsigned short adr, unsigned char *txbuf, unsigned short lenth)
{
bool ret = i2c_memory_chsc6x_write(&i2c_touchpad_handle, id, adr, txbuf, lenth);
if(ret) {
return 0;
}else{
return -1;
}
}
void chsc6x_msleep(int ms)
{
touchpad_delay_ms(ms);
}
void chsc6x_tp_reset(void)
{
touchpad_reset_clear();
touchpad_delay_ms(30);//30ms
touchpad_reset_set();
touchpad_delay_ms(30);//30ms
}
void chsc6x_tp_reset_active(void)
{
touchpad_reset_clear();
touchpad_delay_ms(30);//30ms
touchpad_reset_set();
touchpad_delay_ms(30);//30ms
}

View File

@ -0,0 +1,51 @@
#ifndef __CHSC6X_PLATFORM_H__
#define __CHSC6X_PLATFORM_H__
#include <stdio.h>
#if 0
#define chsc6x_info(x...) pr_notice("[chsc6x] " x)
#define chsc6x_err(x...) pr_err("[chsc6x][error] " x)
#else
#if 0
#define chsc6x_info printf
#define chsc6x_err printf
#else
#define chsc6x_info(x...)
#define chsc6x_err(x...)
#endif
#endif
#define CHSC6X_I2C_ID (0x5c) //8bit
#define CHSC6X_MAX_POINTS_NUM (1)
#define CHSC6X_RES_MAX_X (370)
#define CHSC6X_RES_MAX_Y (370)
/*MACRO SWITCH for driver update TP FW */
#define CHSC6X_AUTO_UPGRADE (0)
/*MACRO SWITCH for multi TP_VENDOR Compatible update TP FW */
#define CHSC6X_MUL_VENDOR_UPGRADE (0)
#define MAX_IIC_WR_LEN (8)
#define MAX_IIC_RD_LEN (16)
/* fail : <0 */
int chsc6x_i2c_read(unsigned char id, unsigned char *p_data, unsigned short lenth);
/* RETURN:0->pass else->fail */
int chsc6x_read_bytes_u16addr_sub(unsigned char id, unsigned short adr, unsigned char *rxbuf, unsigned short lenth);
/* RETURN:0->pass else->fail */
int chsc6x_write_bytes_u16addr_sub(unsigned char id, unsigned short adr, unsigned char *txbuf, unsigned short lenth);
void chsc6x_msleep(int ms);
void chsc6x_tp_reset(void);
void chsc6x_tp_reset_active(void);
#endif

View File

@ -0,0 +1,119 @@
#ifndef __CHSC6X_RAMCODE_H__
#define __CHSC6X_RAMCODE_H__
const unsigned char fw_fcode_burn[1784] = {
0x08,0x80,0x6F,0x6D,0x00,0x00,0xF8,0x06,0x4B,0x4E,0x4C,0x54,0x80,0x01,0x88,0x00,
0x34,0x80,0xC0,0x46,0x00,0xA0,0x17,0x09,0x17,0x0A,0x08,0x50,0x04,0xB1,0x91,0x02,
0xFB,0xCB,0x0C,0x08,0xC0,0x6B,0x0D,0x08,0x85,0x06,0x0B,0x08,0xC0,0x6B,0x0C,0x08,
0x85,0x06,0x0C,0x09,0x40,0xA0,0x08,0x40,0x40,0xA0,0x48,0x40,0x0A,0x09,0x0B,0x0A,
0x0B,0x0B,0x08,0x58,0x10,0x50,0x04,0xB1,0x04,0xB2,0x9A,0x02,0xF9,0xCB,0x00,0x90,
0xF5,0x9A,0xC0,0x46,0x12,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0xF0,0x9D,0x80,0x00,
0xF0,0x9C,0x80,0x00,0x0C,0x06,0x80,0x00,0xF8,0x06,0x00,0x00,0x04,0x8D,0x80,0x00,
0x04,0x8D,0x80,0x00,0x04,0x8D,0x80,0x00,0x00,0xA0,0x80,0x00,0x30,0x00,0x00,0x00,
0x4D,0x03,0x00,0x00,0x31,0x00,0x00,0x00,0x15,0x03,0x00,0x00,0x33,0x00,0x00,0x00,
0xD9,0x04,0x00,0x00,0x32,0x00,0x00,0x00,0xD1,0x02,0x00,0x00,0x30,0x65,0x07,0x0C,
0x01,0xA3,0x23,0x40,0x05,0xF6,0x1C,0xA0,0x00,0x90,0x9E,0x98,0x00,0xA3,0x23,0x40,
0x03,0x0B,0x2D,0xFE,0x1D,0x40,0x00,0x90,0xC7,0x98,0x30,0x6D,0x0D,0x00,0x80,0x00,
0x0C,0x00,0x80,0x00,0xF0,0x65,0xFA,0xA0,0xC0,0xF0,0x00,0x90,0x8D,0x98,0x05,0xA0,
0xFF,0x97,0xE4,0x9F,0x0A,0x0C,0x0B,0x0D,0x00,0xA6,0x01,0xA7,0x05,0x80,0xC8,0xA0,
0x01,0xBC,0x00,0x90,0x81,0x98,0x00,0xAC,0x05,0xC0,0x2E,0x40,0x00,0x90,0xAC,0x98,
0x2B,0x48,0x1F,0x02,0xF3,0xC1,0x04,0x0B,0x01,0xA2,0x1A,0x40,0xF0,0x6D,0xC0,0x46,
0x80,0x96,0x98,0x00,0x0C,0x00,0x80,0x00,0x0D,0x00,0x80,0x00,0x30,0x65,0x07,0x0C,
0x03,0xFC,0x05,0xEC,0x23,0x40,0x00,0x90,0x97,0x98,0x2B,0xFA,0x23,0x40,0x00,0x90,
0x93,0x98,0x25,0x40,0x00,0x90,0x90,0x98,0x30,0x6D,0xC0,0x46,0x0C,0x00,0x80,0x00,
0x10,0x65,0x04,0xEC,0x06,0xA0,0xFF,0x97,0xB1,0x9F,0x20,0xA0,0xFF,0x97,0xAE,0x9F,
0x20,0xEC,0xFF,0x97,0xE3,0x9F,0x03,0x0B,0x01,0xA2,0x1A,0x40,0xFF,0x97,0xBA,0x9F,
0x10,0x6D,0xC0,0x46,0x0D,0x00,0x80,0x00,0xF0,0x65,0x04,0xEC,0x03,0xA0,0x0D,0xEC,
0x16,0xEC,0x0E,0x0F,0xFF,0x97,0x9A,0x9F,0x20,0xEC,0xFF,0x97,0xCF,0x9F,0x00,0xA3,
0x3B,0x40,0x00,0x90,0x69,0x98,0x0A,0x0B,0x0A,0xA2,0x1A,0x40,0x00,0x90,0x64,0x98,
0x00,0xAD,0x07,0xC0,0x00,0xA4,0x3B,0x48,0x33,0x15,0x01,0xB4,0x00,0x90,0x5C,0x98,
0xAC,0x02,0xF8,0xC1,0x02,0x0B,0x01,0xA2,0x1A,0x40,0xF0,0x6D,0x0C,0x00,0x80,0x00,
0x0D,0x00,0x80,0x00,0xF0,0x65,0x04,0xEC,0x06,0xA0,0x0D,0xEC,0x16,0xEC,0xFF,0x97,
0x75,0x9F,0x02,0xA0,0xFF,0x97,0x72,0x9F,0x20,0xEC,0xFF,0x97,0xA7,0x9F,0x00,0xAD,
0x08,0xC0,0x07,0x0F,0x00,0xA4,0x33,0x1D,0x01,0xB4,0x3B,0x40,0x00,0x90,0x3C,0x98,
0xA5,0x02,0xF8,0xC8,0x03,0x0B,0x01,0xA2,0x1A,0x40,0xFF,0x97,0x73,0x9F,0xF0,0x6D,
0x0C,0x00,0x80,0x00,0x0D,0x00,0x80,0x00,0x06,0x09,0x0B,0x58,0x81,0x60,0x00,0x33,
0x43,0xF0,0x18,0xE8,0xC0,0xF0,0x0A,0x58,0x00,0x3B,0xD3,0xEA,0x83,0x02,0xFA,0xC9,
0x01,0x60,0x70,0x07,0x30,0x06,0x80,0x00,0x10,0x65,0x94,0xE0,0x00,0xAC,0x05,0xCD,
0x00,0xA3,0x04,0xD9,0x01,0xB3,0x04,0xD0,0xA3,0x02,0xFA,0xC1,0x10,0x6D,0xC0,0x46,
0x10,0x65,0x09,0xF4,0x49,0xFC,0x03,0xEC,0x00,0xA0,0x00,0xA9,0x0B,0xC0,0x4C,0xEE,
0x24,0xF4,0xE4,0xFB,0x02,0xB4,0x00,0xA2,0x99,0x1A,0x40,0xE8,0x00,0xF4,0x02,0xB2,
0x00,0xFC,0xA2,0x02,0xF8,0xC1,0x10,0x6D,0x30,0x65,0x06,0x0D,0x2B,0x48,0xDA,0xF6,
0x06,0xC5,0x10,0xA4,0x1C,0xA0,0xFF,0x97,0xC7,0x9F,0x2B,0x48,0x1C,0x02,0xF9,0xC1,
0x30,0x6D,0xC0,0x46,0x0D,0x00,0x80,0x00,0x01,0x0B,0x01,0xA2,0x1A,0x40,0x70,0x07,
0x0D,0x00,0x80,0x00,0x01,0x0B,0x00,0xA2,0x1A,0x40,0x70,0x07,0x0D,0x00,0x80,0x00,
0x01,0x0B,0x18,0x40,0x70,0x07,0xC0,0x46,0x0C,0x00,0x80,0x00,0x01,0x0B,0x18,0x40,
0x70,0x07,0xC0,0x46,0x0D,0x00,0x80,0x00,0x01,0x0B,0x18,0x48,0x70,0x07,0xC0,0x46,
0x0C,0x00,0x80,0x00,0x10,0x65,0x03,0x0C,0x00,0xA3,0x23,0x40,0xFF,0x97,0xCC,0x9F,
0x20,0x48,0x10,0x6D,0x0C,0x00,0x80,0x00,0x10,0x65,0x04,0x0C,0x00,0xA3,0x23,0x40,
0xFF,0x97,0xC2,0x9F,0x23,0x48,0x01,0xA0,0x18,0x00,0x10,0x6D,0x0C,0x00,0x80,0x00,
0x30,0x65,0x80,0xA3,0xC2,0x28,0x5B,0xF1,0x9A,0x02,0x04,0xC0,0x0C,0x0B,0x1B,0x58,
0x05,0xA2,0x5A,0x40,0x30,0x6D,0x84,0x28,0x45,0x28,0x00,0xAC,0x0B,0xC0,0x2D,0xF3,
0x28,0xEC,0x01,0xBC,0xFF,0x97,0x1C,0x9F,0x24,0xF4,0x80,0xA3,0x5B,0xF1,0x24,0xFC,
0xED,0xE8,0x00,0xAC,0xF4,0xC1,0x02,0x0B,0x1B,0x58,0x00,0xA2,0x5A,0x40,0xE9,0x87,
0x04,0x8D,0x80,0x00,0x30,0x65,0xC2,0x28,0x84,0x28,0x43,0x28,0x09,0x0D,0x12,0xF4,
0x10,0xEC,0x18,0x03,0x2A,0xEC,0x21,0xEC,0xFF,0x97,0x16,0x9F,0x28,0xEC,0x21,0xEC,
0x00,0x90,0xC4,0x99,0x04,0x0B,0x1B,0x58,0x00,0xA2,0x58,0x20,0x00,0xFC,0x98,0x20,
0x5A,0x40,0x30,0x6D,0x00,0x90,0x80,0x00,0x04,0x8D,0x80,0x00,0xF0,0x65,0x5F,0x06,
0x56,0x06,0x4D,0x06,0x44,0x06,0xF0,0x64,0x83,0x28,0x42,0x28,0x04,0xEC,0x19,0xEC,
0x38,0x08,0x92,0x06,0x99,0x06,0x00,0x90,0xA9,0x99,0xA3,0x29,0xE2,0x28,0x1B,0xF4,
0x9B,0xE8,0x83,0x02,0x09,0xC0,0x34,0x0B,0x1B,0x58,0x03,0xA2,0x5A,0x40,0x3C,0x6C,
0x90,0x06,0x99,0x06,0xA2,0x06,0xAB,0x06,0xF0,0x6D,0x54,0x06,0x23,0xF5,0x00,0xAB,
0x4E,0xC0,0x00,0xA2,0x91,0x05,0x4F,0xC0,0x80,0xA3,0x5C,0xF0,0x4D,0x06,0x00,0xA7,
0xA3,0x06,0x2C,0xEC,0x5D,0x05,0x01,0xC9,0x80,0xA4,0x64,0xF0,0x25,0x0B,0xB8,0x06,
0xFE,0xE8,0xD0,0x04,0x40,0x06,0x21,0xEC,0x32,0xEC,0xFF,0x97,0xF3,0x9E,0x2D,0xEB,
0x40,0x06,0x21,0xEC,0x32,0xEC,0xFF,0x97,0xED,0x9E,0x3F,0xE9,0x00,0xAD,0xE8,0xC1,
0x80,0xA7,0x4D,0x06,0x00,0xA6,0x7F,0xF0,0x2C,0xEC,0xBD,0x02,0x01,0xC9,0x80,0xA4,
0x64,0xF0,0x1A,0x0B,0x30,0xEC,0xF2,0xE8,0x50,0x04,0x21,0xEC,0x2D,0xEB,0xFF,0x97,
0xB3,0x9E,0x36,0xE9,0x00,0xAD,0xEF,0xC1,0x13,0x0B,0x18,0x58,0x11,0x0B,0x45,0x40,
0x1A,0x48,0x12,0x0B,0x1B,0x48,0x9A,0x02,0x0F,0xC1,0x00,0xA3,0x07,0x80,0x0D,0x0C,
0x19,0xE9,0x0E,0x0C,0x1A,0xE9,0x09,0x48,0x12,0x48,0x91,0x02,0x05,0xC1,0x01,0xB3,
0x99,0x05,0xF4,0xC8,0x00,0xA3,0x43,0x20,0xA9,0x87,0x09,0xA3,0x43,0x40,0xA6,0x87,
0x50,0x06,0xFF,0x97,0x7D,0x9E,0xAC,0x87,0x03,0x0B,0x18,0x58,0x4A,0x06,0x42,0x40,
0xF0,0x87,0xC0,0x46,0x00,0x90,0x80,0x00,0x04,0x8D,0x80,0x00,0x80,0x94,0x80,0x00,
0xF0,0x65,0x57,0x06,0x46,0x06,0xC0,0x64,0x80,0xA3,0x07,0xF4,0x00,0xA4,0xDB,0xF0,
0x3F,0xFC,0x00,0xA5,0xA0,0x06,0x9A,0x06,0x3E,0xEC,0x57,0x05,0x01,0xC9,0x80,0xA6,
0xF6,0xF0,0x36,0xF4,0x36,0xFC,0x40,0x06,0x31,0xEC,0x15,0x0A,0xFF,0x97,0x6C,0x9E,
0x00,0xAE,0x19,0xC0,0x70,0xEE,0x13,0x0B,0x00,0xF4,0x00,0xFC,0xC0,0xE8,0x42,0x06,
0x01,0xBB,0x19,0x48,0x64,0xE8,0x51,0x03,0x01,0xB2,0x6D,0xE8,0x24,0xF4,0x2D,0xF4,
0x12,0xF4,0x01,0xB3,0x24,0xFC,0x2D,0xFC,0x12,0xFC,0x83,0x02,0xF1,0xC1,0x33,0xEC,
0x43,0x04,0x1B,0xF4,0x1B,0xFC,0x98,0x06,0xBF,0xEB,0x3F,0xF4,0x3F,0xFC,0x00,0xAF,
0xD2,0xC1,0x28,0xF4,0x20,0x03,0x0C,0x6C,0x90,0x06,0x9A,0x06,0xF0,0x6D,0xC0,0x46,
0x00,0x90,0x80,0x00,0x01,0x90,0x80,0x00,0xF0,0x65,0x19,0x0C,0x00,0xA0,0x08,0xA1,
0x22,0xEC,0xFF,0x97,0x39,0x9E,0x23,0x58,0x01,0xB3,0x1F,0xC0,0x15,0x0B,0x1C,0x28,
0x80,0xA3,0x1B,0xF2,0xA3,0x02,0x00,0xC2,0xF0,0x6D,0x13,0x0B,0x1E,0x28,0x13,0x0B,
0xF6,0xE8,0x73,0xEE,0x9E,0x01,0x00,0xAE,0xF6,0xC1,0x20,0xEC,0xFF,0x97,0xA0,0x9F,
0x0B,0x0D,0x07,0xEC,0x08,0xA1,0x20,0xEC,0x2A,0xEC,0xFF,0x97,0x1D,0x9E,0x2B,0x58,
0xBB,0x02,0xE9,0xC1,0x0A,0x0B,0x1B,0x58,0x5E,0x40,0xE5,0x87,0x09,0x0B,0x1B,0x58,
0x01,0xB3,0xDB,0xC1,0x06,0x0B,0x1B,0x58,0x08,0xA2,0x5A,0x40,0xDC,0x87,0xC0,0x46,
0x00,0x90,0x80,0x00,0x06,0x90,0x80,0x00,0x02,0x90,0x80,0x00,0xCA,0xCA,0xFF,0xFF,
0x04,0x8D,0x80,0x00,0x04,0x90,0x80,0x00,0x70,0x65,0x22,0x0D,0x2B,0x58,0x0F,0xA2,
0x1A,0x40,0x09,0xA2,0x5A,0x40,0x0C,0xA1,0x04,0xEC,0xFF,0x97,0x59,0x9E,0x23,0x48,
0x00,0xA8,0x13,0xC1,0x62,0x48,0xD2,0xE8,0xFF,0xAA,0x0F,0xC1,0x1A,0x0A,0x11,0x48,
0x99,0x02,0x2B,0xC0,0x11,0x4A,0x99,0x02,0x2A,0xC0,0x11,0x4C,0x99,0x02,0x11,0xC0,
0x11,0x4E,0x03,0xA0,0x99,0x02,0x0E,0xC0,0x28,0x58,0x03,0x80,0x28,0x58,0x03,0xA3,
0x43,0x40,0x23,0x48,0x03,0x40,0x06,0xA1,0xFF,0x97,0x3A,0x9E,0x2B,0x58,0x40,0x02,
0xD8,0x20,0x70,0x6D,0x02,0xA0,0x0D,0x09,0x00,0xA3,0x0B,0x40,0x80,0xB1,0x0B,0x40,
0x0B,0x0E,0xC3,0xF0,0x05,0xA1,0xD2,0xE8,0x53,0x58,0x20,0xEC,0x31,0x40,0x00,0x90,
0x73,0x98,0x01,0xA3,0x33,0x40,0x28,0x58,0x23,0x48,0xE3,0x87,0x00,0xA0,0xEA,0x87,
0x01,0xA0,0xE8,0x87,0x04,0x8D,0x80,0x00,0x7C,0x00,0x00,0x00,0x00,0x9E,0x80,0x00,
0x03,0x00,0x80,0x00,0x30,0x65,0x0D,0x0C,0x63,0x4A,0x35,0xAB,0x00,0xC0,0x30,0x6D,
0xFA,0xA0,0x80,0xF0,0xFF,0x97,0xF0,0x9D,0x09,0x0D,0x21,0xEC,0x10,0xA2,0x28,0xEC,
0xFF,0x97,0xFA,0x9D,0x28,0xEC,0xFF,0x97,0x9F,0x9F,0x06,0x08,0x06,0x09,0x10,0xA2,
0xFF,0x97,0xF2,0x9D,0x30,0xA3,0x63,0x42,0xE9,0x87,0xC0,0x46,0x00,0x9F,0x80,0x00,
0x80,0x9F,0x80,0x00,0x40,0x9F,0x80,0x00,0xC0,0x9F,0x80,0x00,0x00,0x65,0x13,0x0B,
0x13,0x0A,0x19,0x58,0x0A,0x00,0x1A,0x50,0x12,0x0B,0x55,0xA2,0x1A,0x40,0x12,0x0A,
0x12,0x0B,0x1A,0x20,0x12,0x0A,0x13,0x0B,0x1A,0x50,0x13,0x0A,0xFF,0xA3,0x1B,0xF6,
0x13,0x50,0x01,0xA3,0x5B,0x02,0x04,0xB2,0x13,0x20,0x10,0x0B,0x00,0xA2,0x10,0x09,
0x1A,0x40,0x01,0xA3,0x0B,0x40,0x10,0xB1,0x0A,0x50,0x0E,0x0A,0x13,0x40,0x80,0xA3,
0x1B,0xF4,0x1F,0xA2,0x1A,0x40,0xFF,0x97,0xB5,0x9F,0xFC,0x87,0x40,0x06,0x80,0x00,
0xFF,0xFF,0xFF,0xFE,0x10,0x04,0x80,0x00,0x00,0x9E,0xFF,0xFF,0x28,0x00,0x80,0x00,
0xC0,0x9F,0x80,0x00,0x04,0x8D,0x80,0x00,0x60,0x00,0x80,0x00,0x68,0x00,0x80,0x00,
0x20,0x06,0x80,0x00,0x03,0x00,0x80,0x00,0x18,0x07,0xC0,0x46,0x30,0x65,0x0D,0xF4,
0x2D,0xFC,0x03,0xEC,0x00,0xA0,0x00,0xAD,0x14,0xC0,0x19,0x48,0x00,0xA4,0x01,0xB3,
0x00,0xA2,0x01,0x80,0x19,0x48,0x01,0xB3,0x08,0xE8,0x51,0x03,0x01,0xB2,0x64,0xE8,
0x12,0xF4,0x00,0xF4,0x24,0xF4,0x12,0xFC,0x00,0xFC,0x24,0xFC,0x95,0x02,0xF1,0xC8,
0x24,0xF4,0x20,0x03,0x30,0x6D,0xC0,0x46
};
#endif

View File

@ -0,0 +1,935 @@
/*===============================================================================================*/
/**
* @file touch.c
*
* @version v1.0
*/
/*=================================================================================================
Rootlink Confidential Proprietary
Advanced Technology and Software Operations
(c) Copyright Rootlink 2015 - , All Rights Reserved
Revision History:
Modification Tracking
Author Date Number Description of Changes
-------- -------- ------- ------------------------
Portability:
Indicate if this module is portable to other compilers or
platforms. If not, indicate specific reasons why is it not portable.
===================================================================================================
INCLUDE FILES
=================================================================================================*/
#include <stdint.h>
#include "fr30xx.h"
#include "chsc5816_ctp.h"
#if 0
#define PRINT_DBG printf
#else
#define PRINT_DBG(...)
#endif
#define RETRY 1000
#define _TOUCH_DOWN 0
#define _TOUCH_UP 1
#define _TOUCH_CONTACT 2
#define CHSC5816_ADDRESS (0x2e<<1)
#define _XSIZE_PHYS 368
#define _YSIZE_PHYS 448
#define __CHSC5816_RESET_SET() touchpad_reset_set()
#define __CHSC5816_RESET_CLEAR() touchpad_reset_clear()
#define HAL_Delay(counter) touchpad_delay_ms(counter)
extern I2C_HandleTypeDef i2c_touchpad_handle;
static struct sm_touch_dev st_dev;
static uint8_t counter;
void touchpad_reset_set(void);
void touchpad_reset_clear(void);
void touchpad_delay_ms(uint32_t counter);
/************************************************************************************
* @fn i2c_memory_read
*
* @brief i2c memory read.
*/
bool i2c_memory_chsc5816_read(I2C_HandleTypeDef *hi2c, uint16_t fu16_DevAddress, uint32_t fu32_MemAddress, uint8_t *fp_Data, uint32_t fu32_Size)
{
uint32_t lu32_RxCount = fu32_Size;
counter = 0;
if (fu32_Size == 0)
goto _exit_i2c_read;
__I2C_DISABLE(hi2c->I2Cx);
hi2c->I2Cx->TAR.TAR = fu16_DevAddress >> 1;
__I2C_ENABLE(hi2c->I2Cx);
hi2c->I2Cx->DATA_CMD = (fu32_MemAddress >> 24) & 0xFF;
hi2c->I2Cx->DATA_CMD = (fu32_MemAddress >> 16) & 0xFF;
while (!__I2C_IS_TxFIFO_EMPTY(hi2c->I2Cx));
/* DevAddress NACK */
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
{
i2c_clear_int_status(hi2c, INT_TX_ABRT);
__I2C_DISABLE(hi2c->I2Cx);
counter = 1;
goto _exit_i2c_read;
}
hi2c->I2Cx->DATA_CMD = (fu32_MemAddress >> 8) & 0xFF;
hi2c->I2Cx->DATA_CMD = fu32_MemAddress & 0xFF;
if (fu32_Size > 1)
{
hi2c->I2Cx->DATA_CMD = CMD_RESTART | CMD_READ;
while (fu32_Size - 2)
{
if (!__I2C_IS_TxFIFO_FULL(hi2c->I2Cx))
{
hi2c->I2Cx->DATA_CMD = CMD_READ;
fu32_Size--;
}
while (!__I2C_IS_RxFIFO_EMPTY(hi2c->I2Cx))
{
*fp_Data++ = hi2c->I2Cx->DATA_CMD & 0xFF;
lu32_RxCount--;
}
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
{
i2c_clear_int_status(hi2c, INT_TX_ABRT);
__I2C_DISABLE(hi2c->I2Cx);
counter = 2;
goto _exit_i2c_read;
}
}
/* Last byte with stop */
while (__I2C_IS_TxFIFO_FULL(hi2c->I2Cx));
hi2c->I2Cx->DATA_CMD = CMD_READ | CMD_STOP;
}
else
{
hi2c->I2Cx->DATA_CMD = CMD_RESTART | CMD_READ | CMD_STOP;
}
while (lu32_RxCount)
{
if (!__I2C_IS_RxFIFO_EMPTY(hi2c->I2Cx))
{
*fp_Data++ = hi2c->I2Cx->DATA_CMD & 0xFF;
lu32_RxCount--;
}
}
while(__I2C_IS_BUSY(hi2c->I2Cx));
return true;
_exit_i2c_read:
PRINT_DBG("I2c r:%d\n",counter);
__NOP();
return false;
}
/************************************************************************************
* @fn i2c_memory_write
*
* @brief i2c memory write.
*/
bool i2c_memory_chsc5816_write(I2C_HandleTypeDef *hi2c, uint16_t fu16_DevAddress, uint8_t *fp_Data, uint32_t fu32_Size)
{
counter = 0;
if (fu32_Size < 2)
goto _exit_i2c_write;
__I2C_DISABLE(hi2c->I2Cx);
hi2c->I2Cx->TAR.TAR = fu16_DevAddress >> 1;
__I2C_ENABLE(hi2c->I2Cx);
hi2c->I2Cx->DATA_CMD = *fp_Data++;
hi2c->I2Cx->DATA_CMD = *fp_Data++;
while (!__I2C_IS_TxFIFO_EMPTY(hi2c->I2Cx));
/* DevAddress NACK */
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
{
i2c_clear_int_status(hi2c, INT_TX_ABRT);
__I2C_DISABLE(hi2c->I2Cx);
counter = 1;
goto _exit_i2c_write;
}
fu32_Size -= 2;
while (fu32_Size - 1 > 0)
{
if (!__I2C_IS_TxFIFO_FULL(hi2c->I2Cx))
{
hi2c->I2Cx->DATA_CMD = *fp_Data++;
fu32_Size--;
}
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
{
i2c_clear_int_status(hi2c, INT_TX_ABRT);
__I2C_DISABLE(hi2c->I2Cx);
counter = 2;
goto _exit_i2c_write;
}
}
/* Last byte with stop */
while (__I2C_IS_TxFIFO_FULL(hi2c->I2Cx));
hi2c->I2Cx->DATA_CMD = *fp_Data | CMD_STOP;
while(__I2C_IS_BUSY(hi2c->I2Cx));
//while(i2c_memory_is_busy(hi2c, fu16_DevAddress));
return true;
_exit_i2c_write:
PRINT_DBG("I2c w:%d\n",counter);
__NOP();
return false;
}
void semi_touch_power_int(void)
{
return;
}
static void semi_touch_msdelay(uint32_t millisecs)
{
HAL_Delay(millisecs);
}
static void semi_touch_reset(void)
{
__CHSC5816_RESET_SET();
HAL_Delay(10);
__CHSC5816_RESET_CLEAR();
HAL_Delay(5);
__CHSC5816_RESET_SET();
HAL_Delay(200);
}
int32_t semi_touch_iic_write(uint32_t reg, uint8_t* pdata, uint16_t len)
{
if(i2c_memory_chsc5816_write(&i2c_touchpad_handle, (uint16_t)CHSC5816_ADDRESS, pdata, len) == 0)
{
return -1;
}
return SEMI_DRV_ERR_OK;
}
/*
reg : must 4B aligned
len : must multiple of 4
*/
int32_t semi_i2c_read_bytes(uint32_t reg, uint8_t* pdata, uint16_t len)
{
if(i2c_memory_chsc5816_read(&i2c_touchpad_handle, (uint16_t)CHSC5816_ADDRESS, reg, pdata, len) == 0)
{
return -1;
}
return SEMI_DRV_ERR_OK;
}
/*
reg - register address, must 4B aligned
buffer - data buffer
len - data length, must 4B aligned
return:
0 - pass
others - fail
*/
int32_t semi_touch_read_bytes(uint32_t reg, uint8_t* buffer, uint16_t len)
{
int32_t ret = SEMI_DRV_ERR_OK;
uint16_t once;
uint32_t retry;
while(len > 0){
once = (len>MAX_IO_BUFFER_LEN)?MAX_IO_BUFFER_LEN:len;
ret = -1;
for(retry=0; retry<3; retry++){
if(semi_i2c_read_bytes(reg, buffer,once) == SEMI_DRV_ERR_OK){
ret = SEMI_DRV_ERR_OK;
break;
}
}
if(ret != SEMI_DRV_ERR_OK){
break;
}
reg += once;
buffer += once;
len -= once;
}
return ret;
}
/*
reg - register address, must 4B aligned
buffer - data buffer
len - data length, must 4B aligned
return:
0 - pass
others - fail
*/
int32_t semi_touch_write_bytes(uint32_t reg, uint8_t* buffer, uint16_t len)
{
int32_t ret = SEMI_DRV_ERR_OK;
uint16_t once;
uint32_t k, retry;
uint8_t writeBuff[MAX_IO_BUFFER_LEN];
while(len > 0){
once = (len<(MAX_IO_BUFFER_LEN-4))?len:(MAX_IO_BUFFER_LEN-4);
writeBuff[0] = (uint8_t)(reg>>24);
writeBuff[1] = (uint8_t)(reg>>16);
writeBuff[2] = (uint8_t)(reg>>8);
writeBuff[3] = (uint8_t)(reg);
for(k=0; k<once; k++){
writeBuff[k+4] = buffer[k];
}
ret = -1;
for(retry=0; retry<3; retry++){
if(semi_touch_iic_write(reg, writeBuff, once+4) == SEMI_DRV_ERR_OK){
ret = SEMI_DRV_ERR_OK;
break;
}
}
if(ret != SEMI_DRV_ERR_OK){
break;
}
reg += once;
buffer += once;
len -= once;
}
return ret;
}
int32_t semi_touch_write_and_check(uint32_t addr, uint8_t* buffer, uint16_t len)
{
int32_t ret = 0, once = 0, index = 0, retry = 0;
uint8_t cmp_buffer[MAX_IO_BUFFER_LEN-4];
while(len > 0){
retry = 0;
do{
ret = SEMI_DRV_ERR_OK;
once = (len<(MAX_IO_BUFFER_LEN-4))?len:(MAX_IO_BUFFER_LEN-4);
ret = semi_touch_write_bytes(addr, buffer, once);
ret = semi_touch_read_bytes(addr, cmp_buffer, once);
for(index = 0; index < once; index++){
if(cmp_buffer[index] != buffer[index]){
ret = -SEMI_DRV_ERR_CHECKSUM;
break;
}
}
if(SEMI_DRV_ERR_OK == ret){
break;
}
}while(++retry < 3);
if(SEMI_DRV_ERR_OK != ret){
break;
}
addr += once;
buffer += once;
len -= once;
}
return ret;
}
int32_t semi_touch_run_ram_code(const uint8_t* bin_code, uint16_t len)
{
int32_t retry;
int32_t ret = 0, reg_value = 0;
for(retry = 0; retry < 5; retry++){
//reset mcu
semi_touch_reset();
//hold mcu
reg_value = 0x12044000;
ret = semi_touch_write_bytes(0x40007000, (uint8_t*)&reg_value, 4);
if(ret != 0){
continue;
}
//open auto feed
reg_value = 0x0000925a;
ret = semi_touch_write_bytes(0x40007010, (uint8_t*)&reg_value, 4);
if(ret != 0){
continue;
}
//run ramcode
ret = semi_touch_write_and_check(0x20000000, (uint8_t* )bin_code, len);
if(ret != 0){
continue;
}
break;
}
if(ret != 0){
return -1;
}
//remap
reg_value = 0x12044002;
ret = semi_touch_write_bytes(0x40007000, (uint8_t*)&reg_value, 4);
if(ret != 0){
return -1;
}
//release mcu
reg_value = 0x12044003;
ret = semi_touch_write_bytes(0x40007000, (uint8_t*)&reg_value, 4);
if(ret != 0){
return -1;
}
semi_touch_msdelay(30);
return 0;
}
static uint16_t caculate_checksum_u16(uint16_t *buf, uint16_t length)
{
uint16_t sum, len, i;
sum = 0;
len = length >> 1;
for (i = 0; i < len; i++) {
sum += buf[i];
}
return sum;
}
static uint32_t caculate_checksum_ex(uint8_t * buf, uint16_t length)
{
uint32_t combchk = 0;
uint16_t k = 0, check = 0, checkex = 0;
for (k = 0; k < length; k++) {
check += buf[k];
checkex += (uint16_t)(k * buf[k]);
}
combchk = (checkex<<16) | check;
return combchk;
}
static int32_t cmd_send_to_tp(struct m_ctp_cmd_std_t *ptr_cmd, struct m_ctp_rsp_std_t *ptr_rsp,
int32_t once_delay, int32_t poolgap)
{
int32_t ret = -SEMI_DRV_ERR_HAL_IO;
uint32_t retry = 0;
uint32_t cmd_rsp_ok = 0;
ptr_cmd->tag = 0xE9;
ptr_cmd->chk = 1 + ~caculate_checksum_u16((uint16_t*)&ptr_cmd->d0, sizeof(struct m_ctp_cmd_std_t) - 2);
ret = semi_touch_write_bytes(0x20000000, (uint8_t*)ptr_cmd, sizeof(struct m_ctp_cmd_std_t));
if(ret != 0){ // TODO: need confirm!!!
return -1;
}
semi_touch_msdelay(once_delay);
while(retry++ < 20){
semi_touch_msdelay(poolgap);
ret = semi_touch_read_bytes(0x20000000, (uint8_t*)ptr_rsp, sizeof(struct m_ctp_rsp_std_t));
if(ret != 0){ // TODO: need confirm!!!
return -1;
}
if(ptr_cmd->id != ptr_rsp->id){
continue;
}
if(!caculate_checksum_u16((uint16_t*)ptr_rsp, sizeof(struct m_ctp_rsp_std_t))){
if(0 == ptr_rsp->cc){ //success
cmd_rsp_ok = 1;
}
break;
}
}
ret = -1;
if(cmd_rsp_ok == 1){
ret = SEMI_DRV_ERR_OK;
}
return ret;
}
/*
return:
0(SEMI_DRV_ERR_OK) ->success
others ->fail
*/
static int32_t semi_touch_nvm_read(uint8_t *pdes, uint32_t adr, uint32_t len)
{
int32_t ret = -1;
uint32_t left = len;
uint32_t local_check, retry;
struct m_ctp_cmd_std_t cmd_send_tp;
struct m_ctp_rsp_std_t ack_from_tp;
cmd_send_tp.id = CMD_MEM_RD;
while (left) {
len = (left > 1024) ? 1024 : left;
cmd_send_tp.d0 = adr & 0xffff;
cmd_send_tp.d1 = len;
cmd_send_tp.d2 = 0;
cmd_send_tp.d3 = NVM_R;
cmd_send_tp.d5 = (adr >> 16) & 0xffff;
retry = 0;
while (retry++ < 3) {
ack_from_tp.id = CMD_NA;
ret = cmd_send_to_tp(&cmd_send_tp, &ack_from_tp, 20, 10);
if(SEMI_DRV_ERR_OK != ret){
continue;
}
semi_touch_read_bytes(TP_RD_BUFF_ADDR, pdes, len);
local_check = caculate_checksum_ex(pdes, len);
if ((ack_from_tp.d0 != (uint16_t)local_check) ||
(ack_from_tp.d1 != (uint16_t)(local_check >> 16))){
ret = -SEMI_DRV_ERR_CHECKSUM;
continue;
}
break;
}
adr += len;
left -= len;
pdes += len;
if(ret != SEMI_DRV_ERR_OK){
break;
}
}
return ret;
}
static int32_t semi_touch_nvm_write(uint8_t *psrc, uint32_t adr, uint32_t len)
{
int32_t ret = -1;
uint32_t left = len;
uint32_t retry, combChk;
struct m_ctp_cmd_std_t cmd_send_tp;
struct m_ctp_rsp_std_t ack_from_tp;
cmd_send_tp.id = CMD_MEM_WR;
while (left) {
len = (left > 1024) ? 1024 : left;
combChk = caculate_checksum_ex(psrc, len);
cmd_send_tp.d0 = adr & 0xffff; /* addrss space[0,64K) */
cmd_send_tp.d1 = len;
cmd_send_tp.d3 = NVM_W;
cmd_send_tp.d2 = (uint16_t) combChk;
cmd_send_tp.d4 = (uint16_t) (combChk >> 16);
cmd_send_tp.d5 = (adr >> 16) & 0xffff;
retry = 0;
while (++retry <= 3) {
ret = semi_touch_write_bytes(TP_WR_BUFF_ADDR, psrc, len);
if(SEMI_DRV_ERR_OK != ret) continue;
ack_from_tp.id = CMD_NA;
ret = cmd_send_to_tp(&cmd_send_tp, &ack_from_tp, 200, 20);
if(SEMI_DRV_ERR_OK != ret) continue;
break;
}
left -= len;
adr += len;
psrc += len;
if(ret != SEMI_DRV_ERR_OK){
break;
}
}
return ret;
}
static int32_t semi_touch_burn_erase(void)
{
struct m_ctp_cmd_std_t cmd_send_tp;
struct m_ctp_rsp_std_t ack_from_tp;
cmd_send_tp.id = CMD_FLASH_ERASE;
cmd_send_tp.d0 = 0x01;
return cmd_send_to_tp(&cmd_send_tp, &ack_from_tp, 1000, 40);
}
/*
This function push IC into NVM mode, call it carefully and must reset
IC to enter normal mode.
return:
0(SEMI_DRV_ERR_OK) ->success
others ->fail
*/
static int32_t semi_touch_enter_burn_mode(void)
{
struct m_ctp_cmd_std_t cmd_send_tp;
struct m_ctp_rsp_std_t ack_from_tp;
ack_from_tp.d0 = 0;
cmd_send_tp.id = CMD_IDENTITY;
cmd_send_to_tp(&cmd_send_tp, &ack_from_tp, 20, 5);
if((ack_from_tp.d0 == 0xE9A2) && (ack_from_tp.d1 == 0x165d)){
return SEMI_DRV_ERR_OK;
}
if(semi_touch_run_ram_code(fw_5816_burn, sizeof(fw_5816_burn)) != 0){
return -1;
}
cmd_send_tp.id = CMD_IDENTITY;
if(cmd_send_to_tp(&cmd_send_tp, &ack_from_tp, 20, 5) != 0){
return -1;
}
if((ack_from_tp.d0 == 0xE9A2) && (ack_from_tp.d1 == 0x165d)){
return SEMI_DRV_ERR_OK;
}
return -SEMI_DRV_ERR_HAL_IO;
}
static int32_t semi_get_backup_pid(uint32_t *id)
{
st_dev.ctp_status = CTP_UPGRAD_RUNING;
if(semi_touch_enter_burn_mode() != SEMI_DRV_ERR_OK){
return -1;
}
return semi_touch_nvm_read((uint8_t *)id, VID_PID_BACKUP_ADDR, 4);
}
static int32_t semi_touch_update_check(void)
{
uint32_t pvid;
uint8_t * pfw;
uint32_t * plist;
int32_t k, idx_active;
uint16_t upd_boot_ver = 0;
struct chsc_updfile_header *upd_header;
st_dev.needUpd = 0;
st_dev.updPdata = 0;
st_dev.newBootLen = 0;
if(st_dev.setup_ok == 0){
if(semi_get_backup_pid(&pvid) == 0){
st_dev.vid_pid = pvid;
}
}
if((uint32_t)chsc_upd_data & 3){
PRINT_DBG("chsc::illegal memory buffer, must 4B aliged\n");
return -SEMI_DRV_INVALID_PARAM;
}
upd_header = (struct chsc_updfile_header *)chsc_upd_data;
if((upd_header->sig != 0x43534843) || (upd_header->n_match == 0)) {
PRINT_DBG("chsc::illegal upd_header\n");
return -SEMI_DRV_ERR_NOT_MATCH;
}
if((upd_header->len_boot <= 15*1024) || (upd_header->len_boot >= 40*1024)) {
PRINT_DBG("chsc::illegal upd_header\n");
return -SEMI_DRV_ERR_NOT_MATCH;
}
plist = (uint32_t *)((uint8_t *)chsc_upd_data + sizeof(struct chsc_updfile_header));
pfw = (uint8_t *)plist + (upd_header->n_match*4) + upd_header->len_cfg;
if((pfw[0x30] != 0x16) || (pfw[0x31] != 0x58)){
PRINT_DBG("chsc:no chsc5816 fw found\n");
return -SEMI_DRV_ERR_NOT_MATCH;
}
st_dev.updPdata = pfw;
st_dev.newBootLen = upd_header->len_boot;
idx_active = -1;
upd_boot_ver = (pfw[0x3f] << 8) + pfw[0x3e];
for (k=0; k<upd_header->n_match; k++) {
pvid = plist[k];
PRINT_DBG("chsc::pid_vid in list=0x%x\n", pvid);
if ((pvid & PID_VID_MASK) == (st_dev.vid_pid & PID_VID_MASK)) {
PRINT_DBG("chsc::running_ver=%d, upd_ver=%d\n", st_dev.fw_ver, upd_boot_ver);
if((st_dev.fw_ver < upd_boot_ver) || (st_dev.setup_ok == 0)){
idx_active = k;
}
break;
}
}
if((st_dev.setup_ok == 0) && (idx_active < 0)){
idx_active = 0;
}
if(idx_active >= 0){
st_dev.needUpd = 1;
}
return SEMI_DRV_ERR_OK;
}
/*
return:
0 ->success
others ->fail
*/
static int32_t semi_touch_update(uint8_t *pdata, uint32_t len)
{
if((pdata == NULL) || (len<1024) || (len>0x9f00)){
PRINT_DBG("chsc:semi_touch_update, not chsc5816 fw\n");
return -1;
}
if((pdata[0x30] != 0x16) || (pdata[0x31] != 0x58)){
PRINT_DBG("chsc:semi_touch_update, not chsc5816 fw\n");
return -1;
}
if(semi_touch_enter_burn_mode() != 0){
//kal_prompt_trace(MOD_WAP,"chsc::semi_touch_enter_burn_mode fail\n");
return -1;
}
if(semi_touch_burn_erase() != 0){
PRINT_DBG("chsc::semi_touch_burn_erase fail\n");
return -1;
}
if(semi_touch_nvm_write(pdata, 0x00000000, len) != 0){
PRINT_DBG("chsc::semi_touch_nvm_write fail\n");
return -1;
}
return SEMI_DRV_ERR_OK;
}
static void semi_touch_setup_check(void)
{
int32_t retry = 0;
uint32_t naFlag = 0;
img_header_t image_header;
img_header_t image_confirm;
//clean boot status
semi_touch_write_bytes(0x20000018, (uint8_t*)&naFlag, 4);
semi_touch_reset();
st_dev.fw_ver = 0;
st_dev.vid_pid = 0;
st_dev.setup_ok = 0;//default error
image_header.sig = 0;
for(retry=0; retry<10; retry++){
semi_touch_msdelay(10);
if(semi_touch_read_bytes(0x20000014, (uint8_t*)&image_header, sizeof(image_header)) != 0){
continue;
}
if(semi_touch_read_bytes(0x20000014, (uint8_t*)&image_confirm, sizeof(image_confirm)) != 0){
continue;
}
if((image_header.sig != image_confirm.sig) ||
(image_header.vid_pid != image_confirm.vid_pid) ||
(image_header.raw_offet != image_confirm.raw_offet) ||
(image_header.dif_offet != image_confirm.dif_offet) ||
(image_header.fw_ver != image_confirm.fw_ver)){
//kal_prompt_trace(MOD_WAP,"chsc::double check, retry\n");
continue;
}
if(image_header.sig == 0x43534843){ //"CHSC"
st_dev.fw_ver = image_header.fw_ver;
st_dev.vid_pid = image_header.vid_pid;
st_dev.raw_adr = image_confirm.raw_offet + 0x20000000;
st_dev.setup_ok = 1;//pass
st_dev.ctp_status = CTP_POINTING_WORK;
break;
}else if(image_header.sig == 0x4F525245){ //boot self check fail
break;
}
}
return;
}
int32_t semi_touch_dect(void)
{
uint32_t u32Data, retry;
for(retry=0; retry<3; retry++){
semi_touch_reset();
if(!semi_touch_read_bytes(0x20000000, (uint8_t *)&u32Data, 4)){
return 0;
}
}
return -1;
}
void semi_touch_irq_handler_imp(void)
{
#define _UI_MAX_POINTS 1
#define GEST_CODE_ACT_LS 0x10 //left
#define GEST_CODE_ACT_RS 0x20 //right
#define GEST_CODE_ACT_US 0x30 //up
#define GEST_CODE_ACT_DS 0x40 //down
int pointed = 0;
union rpt_point_t* ppt;
unsigned char gestCode;
unsigned char data[8];
int x, y;
PRINT_DBG("semi_touch_irq_handler_imp\r\n");
if(semi_touch_read_bytes(0x2000002c, data, 8)){
PRINT_DBG("chsc:read pixel data fail\n" );
return;
}
PRINT_DBG("imp = %x %x\r\n",data[0], data[1]);
pointed = 0;
ppt = (union rpt_point_t*)&data[2];
if((data[0] == 0xff) && (data[1] <= 2)){
if(data[1] > 0){
pointed = 1;
x = (unsigned int)(ppt->rp.x_h4 << 8) | ppt->rp.x_l8;
y = (unsigned int)(ppt->rp.y_h4 << 8) | ppt->rp.y_l8;
}
}else{
return;
}
}
bool semi_touch_read_coordinate(int16_t *x, int16_t *y)
{
int pointed = 0;
union rpt_point_t* ppt;
unsigned char data[8];
if(semi_touch_read_bytes(0x2000002c, data, 8)){
PRINT_DBG("chsc:read pixel data fail\n" );
return 0;
}
pointed = 0;
ppt = (union rpt_point_t*)&data[2];
if((data[0] == 0xff) && (data[1] <= 2)){
if(data[1] > 0){
pointed = 1;
*x = (unsigned int)(ppt->rp.x_h4 << 8) | ppt->rp.x_l8;
*y = (unsigned int)(ppt->rp.y_h4 << 8) | ppt->rp.y_l8;
PRINT_DBG("x = %d y = %d \r\n",*x, *y);
}
}
return pointed;
}
int semi_touch_init()
{
semi_touch_power_int();
if(semi_touch_dect() != SEMI_DRV_ERR_OK){
PRINT_DBG("chsc:no chsc5816\r\n" );
return -1;
}
semi_touch_setup_check();
semi_touch_update_check();
semi_touch_reset();
st_dev.ctp_status = CTP_POINTING_WORK;
PRINT_DBG("chsc init ok\r\n" );
return 0;
}

View File

@ -0,0 +1,170 @@
#include <stdint.h>
#include "driver_touchpad.h"
#include "FreeRTOS.h"
#include "task.h"
//#define TOUCHPAD_SH8601A
//#define TOUCHPAD_ICNA3310
//#define TOUCHPAD_CHSC586
//#define TOUCHPAD_CHSC6x
//#define TOUCHPAD_CTP820
#define TOUCHPAD_FT6336U
#ifdef TOUCHPAD_SH8601A
#define TOUCHPAD_IIC_SLAVE_ADDRESS (0x2C<<1) // from sh8601a
#endif
#ifdef TOUCHPAD_ICNA3310
#define TOUCHPAD_IIC_SLAVE_ADDRESS (0x48 << 1) // from icna3310
#endif
#ifdef TOUCHPAD_CTP820
#define TOUCHPAD_IIC_SLAVE_ADDRESS (0x15 << 1) // from ctp820
#endif
#ifdef TOUCHPAD_FT6336U
#define TOUCHPAD_IIC_SLAVE_ADDRESS (0x71) // from ft6336u
#endif
#ifdef TOUCHPAD_CHSC586
extern bool semi_touch_read_coordinate(int16_t *x, int16_t *y);
extern int semi_touch_init();
#endif
#ifdef TOUCHPAD_CHSC6x
bool chsc6x_read_touch_info(int16_t *x, int16_t *y);
void chsc6x_init(void);
#endif
bool touchpad_read(int16_t *x, int16_t *y)
{
#ifdef TOUCHPAD_SH8601A
uint8_t buffer[8];
bool pressed = false;
i2c_memory_read(&i2c_touchpad_handle, TOUCHPAD_IIC_SLAVE_ADDRESS, 0, buffer, 8);
if (buffer[2] != 0) {
*x = ((buffer[3]&0x0f)<<8) | buffer[4];
*y = ((buffer[5]&0x0f)<<8) | buffer[6];
pressed = true;
}
else {
pressed = false;
}
return pressed;
#endif
#ifdef TOUCHPAD_ICNA3310
uint8_t buffer[9];
bool pressed = false;
i2c_memory_read(&i2c_touchpad_handle, TOUCHPAD_IIC_SLAVE_ADDRESS, 0x1000, buffer, 9);
if (buffer[1] == 1) {
*x = ((buffer[4]&0x0f)<<8) | buffer[3];
*y = ((buffer[6]&0x0f)<<8) | buffer[5];
pressed = true;
}
else {
pressed = false;
}
return pressed;
#endif
#ifdef TOUCHPAD_CHSC586
return semi_touch_read_coordinate(x, y);
#endif
#ifdef TOUCHPAD_CHSC6x
return chsc6x_read_touch_info(x, y);
#endif
#ifdef TOUCHPAD_CTP820
uint8_t buffer[7];
bool pressed = false;
i2c_memory_read(&i2c_touchpad_handle, TOUCHPAD_IIC_SLAVE_ADDRESS, 0x00, buffer, 7);
if (buffer[2] == 1) {
*x = ((buffer[3]&0x0f)<<8) | buffer[4];
*y = ((buffer[5]&0x0f)<<8) | buffer[6];
pressed = true;
}
else {
pressed = false;
}
return pressed;
#endif
#ifdef TOUCHPAD_FT6336U
uint8_t buffer[7];
bool pressed = false;
i2c_memory_read(&i2c_touchpad_handle, TOUCHPAD_IIC_SLAVE_ADDRESS, 0x00, buffer, 7);
if (buffer[2] == 1) {
*x = ((buffer[3]&0x0f)<<8) | buffer[4];
*y = ((buffer[5]&0x0f)<<8) | buffer[6];
pressed = true;
}
else {
pressed = false;
}
return pressed;
#endif
return false;
}
void touchpad_init(void)
{
#ifdef TOUCHPAD_ICNA3310
/* reset touch pad chip */
__TOUCHPAD_RESET_SET();
__TOUCHPAD_DELAY_MS(10);
__TOUCHPAD_RESET_CLEAR();
__TOUCHPAD_DELAY_MS(5);
__TOUCHPAD_RESET_SET();
__TOUCHPAD_DELAY_MS(200);
#endif
#ifdef TOUCHPAD_CHSC586
semi_touch_init();
#endif
#ifdef TOUCHPAD_CHSC6x
chsc6x_init();
#endif
#ifdef TOUCHPAD_CTP820
/* reset touch pad chip */
__TOUCHPAD_RESET_SET();
__TOUCHPAD_DELAY_MS(10);
__TOUCHPAD_RESET_CLEAR();
__TOUCHPAD_DELAY_MS(10);
__TOUCHPAD_RESET_SET();
__TOUCHPAD_DELAY_MS(50);
#endif
#ifdef TOUCHPAD_FT6336U
/* reset touch pad chip */
__TOUCHPAD_RESET_SET();
__TOUCHPAD_RESET_CLEAR();
vTaskDelay(10);
__TOUCHPAD_RESET_SET();
vTaskDelay(250);
#endif
}
void touchpad_sleep(void)
{
#ifdef TOUCHPAD_CTP820
uint8_t value = 0x03;
i2c_memory_write(&i2c_touchpad_handle, TOUCHPAD_IIC_SLAVE_ADDRESS, 0xE5, &value, 1);
#endif
}

View File

@ -0,0 +1,88 @@
#ifndef _DRIVER_TOUCHPAD_H
#define _DRIVER_TOUCHPAD_H
#include <stdint.h>
#include "driver_i2c.h"
#ifdef __cplusplus
extern "C"
{
#endif
//*****************************************************************************
//
// Macro Variables definitions
//
//*****************************************************************************
#define __TOUCHPAD_RESET_SET() touchpad_reset_set()
#define __TOUCHPAD_RESET_CLEAR() touchpad_reset_clear()
#define __TOUCHPAD_DELAY_MS(counter) touchpad_delay_ms(counter)
//*****************************************************************************
//
// Global Variables definitions
//
//*****************************************************************************
extern I2C_HandleTypeDef i2c_touchpad_handle;
//*****************************************************************************
//
// External function definitions
//
//*****************************************************************************
/************************************************************************************
* @fn touchpad_reset_set
*
* @brief Set touchpad driver RESET pin to HIGH, this function should be implemented by user..
*/
void touchpad_reset_set(void);
/************************************************************************************
* @fn touchpad_reset_clear
*
* @brief Set touchpad driver RESET pin to LOW, this function should be implemented by user.
*/
void touchpad_reset_clear(void);
/************************************************************************************
* @fn touchpad_delay_ms
*
* @brief Used in touchpad driver. co_delay_100us or vTaskDelay can be used for implementation
* by user.
*/
void touchpad_delay_ms(uint32_t counter);
/************************************************************************************
* @fn touchpad_read
*
* @brief used to read data from touchpad, these data are update in interrupt
*
* @param x: current x position.
* y: current y position.
*
* @return true: pressed and x, y value is valid; false: released
*/
bool touchpad_read(int16_t *x, int16_t *y);
/************************************************************************************
* @fn touchpad_init
*
* @brief used to init touchpad
*/
void touchpad_init(void);
/************************************************************************************
* @fn touchpad_sleep
*
* @brief touchpad go to sleep
*/
void touchpad_sleep(void);
#ifdef __cplusplus
}
#endif
#endif // _DRIVER_TOUCHPAD_H